Como dividir linhas em um arquivo de dados enorme com base no número de colunas dentro delas no Linux?

Como dividir linhas em um arquivo de dados enorme com base no número de colunas dentro delas no Linux?

Eu tenho um arquivo de dados parecido com:

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

Quero dividir essas linhas com mais de 4 colunas em linhas menores com no máximo 4 colunas em cada linha. portanto a saída deve 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

Alguma sugestão, por favor? Por favor, considere que meu arquivo de dados real é enorme.

Responder1

Com awk:

awk '{ if(NF>4) for(i=5; i<=NF; i+=4) $i = "\n" $i } 1' file

Com sed:

sed 's/ /\n/4;T;P;D' file

Com perl:

perl -lpe '$c = 0; s/ /++$c % 4 ? " " : "\n"/goe' file

Saída:

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

Responder2

A abordagem mais fácil seria um método de mesclagem tardia ou zíper. Suponha que o último caractere de cada linha seja um espaço em branco. Primeiro divida seu arquivo em dois, de acordo com as colunas que deseja cortar.

cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2

Em segundo lugar, mescle os arquivos por meio da mesclagem tardia e exclua as linhas vazias.

paste -d'\n' file1 file2 | sed '/^$/d'

informação relacionada