
Coletei dados com 3 campos. Quero imprimir os dados do terceiro campo em uma única linha. Estes são os dados que estou obtendo.
$ 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
Responder1
O script a seguir junta à linha anterior qualquer linha que não comece com 2 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 2 primeiros campos forem números (e se não for a primeira linha).
Responder2
Curtosed
abordagem:
sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' 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
Responder3
Algumas abordagens estranhas:
Armazene a linha mais recente que começa com um dígito e anexe 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. Presumo que um registro seja dividido no máximo 1 vez
tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac