Algo como
awk 'NF>1 {x=$1; print; next} {print x,$1}' Input
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Se você quiser refinar o alinhamento da saída, canalize-o em column -t
Sample Input:
James account
note
money
Ruby account
money
Taylor account
note
Rob money
Desired Output:
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Como você observa na saída acima, todos os espaços em branco na primeira coluna são preenchidos com o valor obtido da linha anterior não vazia. Eu estou usando o KSH, Linux x86. Eu prefiro o awk, sed.
$ awk 'NF == 1 { $2 = $1; $1 = col1 } { col1 = $1; print }' file
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Se o número de campos delimitados por espaços em branco na linha atual for um ( NF == 1
), mova o conteúdo do primeiro campo para o segundo (que está vazio) e atribua o valor salvo em col1
para o primeiro campo.
Para todas as linhas, salve o valor do primeiro campo em col1
e imprima.
Uma maneira com GNU sed
é a seguinte:
sed -re ' ;# invoke GNU sed with extended regex engine
/\S\s+\S/N ;# append the next line into the PS for multi-field lines
s/^((\S+\s+).*\n)\s+// ;# stick the first two fields from 1st line to 2nd
P;D ;# print multi-field line, & the 2nd line too now is multi-field
' input.file
Saída:
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Restrições:
Usando o corte e o tr:
while IFS=$'\n' read -r line
do
if printf -- '%s\n' "$line" | grep -E -q '^[[:blank:]]'
then
# is blank
word="$(printf -- '%s\n' "$line" | tr -d '[:blank:]')"
printf -- '%s %s\n' "$prefix" "$word"
else
# is not blank
prefix="$(printf -- '%s\n' "$line" | cut -d ' ' -f 1)"
printf -- '%s\n' "$line" | tr -s ' '
fi
done < file
Saída:
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Em seguida, ele pode ser preenchido com column -t
, conforme mencionado .
Como alternativa, sem column
:
length=0
while read -r line
do
cur_length="$(printf -- '%s\n' "$line" | cut -d ' ' -f 1 | wc -c)"
[ "$cur_length" -gt "$length" ] && length="$cur_length"
done < file
while IFS=$'\n' read -r line
do
if printf -- '%s\n' "$line" | grep -E -q '^[[:blank:]]'
then
# is blank
word="$(printf -- '%s\n' "$line" | tr -d '[:blank:]')"
printf -- "%-${length}s%s\n" "$prefix" "$word"
else
# is not blank
prefix="$(printf -- '%s\n' "$line" | cut -d ' ' -f 1 | \
tr -d '[:blank:]')"
suffix="$(printf -- '%s\n' "$line" | cut -d ' ' -f 2- | \
tr -d '[:blank:]')"
printf -- "%-${length}s%s\n" "$prefix" "$suffix"
fi
done < file
Saída:
James account
James note
James money
Ruby account
Ruby money
Taylor account
Taylor note
Rob money
Tags text-processing awk sed