¿Cómo dividir filas en un archivo de datos enorme según la cantidad de columnas que contienen en Linux?

¿Cómo dividir filas en un archivo de datos enorme según la cantidad de columnas que contienen en Linux?

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'

información relacionada