En Bash, ¿cómo imprimir una fila en una sola línea usando un delimitador?

En Bash, ¿cómo imprimir una fila en una sola línea usando un delimitador?

He recopilado datos con 3 campos. Quiero imprimir los datos del tercer campo en una sola línea. Estos son los datos que estoy obteniendo.

$ 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 tengo hasta ahora

while read file; do if [[ $file == 1 ]]; then echo -n; fi; done 

Respuesta1

El siguiente script une con la línea anterior cualquier línea que no comience con 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

Esto se basa en ORS(separador de registros de salida) que se restablece a una cadena vacía. La nueva línea se agrega si los 2 primeros campos son números (y si no es la primera línea).

Respuesta2

Cortosedacercarse:

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

La salida:

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

Respuesta3

Un par de enfoques extraños:

Almacene la línea más reciente que comienza con un dígito, agréguela si la línea actual no comienza con un dígito

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

Invierta el archivo. Si una línea comienza con un número que no es un dígito, lea la línea siguiente y agregue la línea anterior. Invierta los resultados. Supongo que un registro se divide como máximo una vez.

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

información relacionada