Linux에서 열 수를 기준으로 거대한 데이터 파일의 행을 분할하는 방법은 무엇입니까?

Linux에서 열 수를 기준으로 거대한 데이터 파일의 행을 분할하는 방법은 무엇입니까?

다음과 같은 데이터 파일이 있습니다.

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

4개 이상의 열이 있는 행을 각 행 내에 최대 4개의 열이 있는 더 작은 행으로 분할하고 싶습니다. 따라서 출력은 다음과 같아야 합니다.

 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

어떤 제안이라도 해주실 수 있나요? 내 실제 데이터 파일이 엄청나다는 점을 고려하십시오.

답변1

와 함께 awk:

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

와 함께 sed:

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

와 함께 perl:

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

산출:

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

답변2

가장 쉬운 접근 방식은 늦은 병합 또는 지퍼 방법입니다. 각 줄의 마지막 문자는 공백이라고 가정합니다. 먼저 잘라내려는 열을 기준으로 파일을 두 개로 분할합니다.

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

두 번째로 늦은 병합을 통해 파일을 병합하고 빈 줄을 삭제합니다.

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

관련 정보