No Bash, como imprimir linha em uma única linha usando um delimitador?

0

Eu coletei dados com 3 campos. Quero imprimir os dados do terceiro campo em uma única linha. Esses são os dados que estou recebendo.

$ cat file
1234  1234  dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0

Resultado esperado:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

Códigos que tenho até agora

while read file; do if [[ $file == 1 ]]; then echo -n; fi; done 
    
por Katherine Leigreen 29.05.2018 / 09:17

3 respostas

1

O script a seguir associa a linha anterior a qualquer linha que não comece com dois números:

$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

Isso depende de ORS (separador de registro de saída) que é redefinido para uma string vazia. A nova linha é adicionada se os dois primeiros campos forem números (e se não for a primeira linha).

    
por 29.05.2018 / 09:37
1

Abordagem curta sed :

sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)//' file

A saída:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
    
por 29.05.2018 / 10:13
0

Algumas abordagens do awk:

Armazena a linha mais recente que começa com um dígito, anexa a ela se a linha atual não começar com um dígito

awk '
    /^[[:digit:]]/ {if (prev) print prev; prev=$0; next} 
    {prev = prev $0} 
    END {if (prev) print prev}
' file

Inverta o arquivo. Se uma linha começar com um não dígito, leia a próxima linha e anexe a linha anterior. Inverta os resultados. Eu assumo que um registro é dividido no máximo 1 vez

tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac
    
por 29.05.2018 / 16:43