Tengo un archivo de datos que se parece a:
1
2 4 5 6 7 19
20
22
24 26 27
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300
Quiero dividir esas filas con más de 4 columnas en filas más pequeñas con un máximo de 4 columnas dentro de cada fila. por lo tanto la salida debería ser:
1
2 4 5 6
7 19
20
22
24 26 27
29 30 31 32
34 40 50 56
58
234 235 270 500
1234 1235 1236 1237
2300
¿Alguna sugerencia por favor? Tenga en cuenta que mi archivo de datos reales es enorme.
Respuesta1
Con awk
:
awk '{ if(NF>4) for(i=5; i<=NF; i+=4) $i = "\n" $i } 1' file
Con sed
:
sed 's/ /\n/4;T;P;D' file
Con perl
:
perl -lpe '$c = 0; s/ /++$c % 4 ? " " : "\n"/goe' file
Producción:
1
2 4 5 6
7 19
20
22
24 26 27
29 30 31 32
34 40 50 56
58
234 235 270 500
1234 1235 1236 1237
2300
Respuesta2
El enfoque más sencillo sería un método de combinación tardía o cremallera. Supongamos que el último carácter de cada línea es un espacio en blanco. Primero divide tu archivo en dos, con respecto a las columnas que deseas cortar.
cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2
En segundo lugar, combine los archivos mediante combinación tardía y elimine las líneas vacías.
paste -d'\n' file1 file2 | sed '/^$/d'