Como preencher os espaços em branco na primeira coluna com o valor obtido da linha anterior em branco?

0
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.

    
por ayrton_senna 09.08.2018 / 19:42

4 respostas

3

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

    
por 09.08.2018 / 19:50
1
$ 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.

    
por 09.08.2018 / 19:53
0

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:

  1. A entrada com linha de vários campos não deve começar com espaços em branco / espaços.
  2. O GNU sed suporta regexes estendidas, embora este código possa ser reformulado para ser POSIXly.
por 09.08.2018 / 21:07
0

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
    
por 09.08.2018 / 19:59