Como dividir linhas em um arquivo de dados enorme baseado no número de colunas dentro delas no linux?

1

Eu tenho um arquivo de dados como:

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

Eu 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 o meu arquivo de dados real é enorme.

    
por zara 25.05.2017 / 16:55

2 respostas

3

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
    
por 25.05.2017 / 17:04
1

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

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

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

paste -d'\n' file1 file2 | sed '/^$/d'
    
por 26.05.2017 / 01:27