2017-05-04 1 views
-1

열 1에 다른 값이있는 것처럼 많은 파일을 원하지는 않지만 비슷한 질문을 신중히 인용합니다. here 예를 들어, from :대용량 파일을 첫 번째 열 값을 기준으로 일련 번호가 지정된 파일로 분할합니다.

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 
B.Y|1|1 
B.Y|1|2 

각 파일에 최대 5 줄까지 포함 된 x 파일로 분할하고 싶습니다. 예에서, 내가이 개 파일을 원하는 것 :

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

B.Y|1|1 
B.Y|1|2 

된 awk -F를 \ | '{print> $ 1}'file1

이 예제의 경우 2 단계로 쉽게 목표를 달성 할 수 있습니다. 내 실제 파일의 경우, 첫 번째 열에 약 200Gig의 큰 파일과 10 백만 개의 고유 값을 분할하려고합니다. 각 파일에 약 1,000,000 개의 줄 (예 : 유연한 임계 값)이 있어야합니다. 내가 수백만 개의 파일을 생성 할 여력이 없어서 2 단계로 작성하는 것은 불가능합니다. 어떤 생각?

이중 스캐닝
+0

글쎄, 1 천만 개의 고유 한 "키"와 파일 당 최대 5 줄을 사용하면 결국 최대 2 백만 파일. 어쩌면 우리가해야 할 일을 오래 전에 끝내면, 어떻게해야 하는지를 도울 수 있습니다. –

+0

불분명 함, 최대 5 줄 *을 포함하는 파일을 작성했지만 frst 출력에는 4 줄이 포함되어 있습니다. 그런 다음, * 수백만 개의 파일을 생성 할 여력이 없지만 동시에 큰 파일을 분할하려고합니다. 일관성없는 소리 – RomanPerekhrest

+0

혼란을 가져 주어서 죄송합니다. 나는 나의 질문을 다시 편집했다. – Sara

답변

1

파일은 당신이 고유 키 중 하나를 원하는 파일의 길이보다 더 레코드가 할 수있는 경우 그러나, 비 분할 및 최대 파일 길이를 유지하면 충돌 할

$ awk -F\| -v size=5 'NR==FNR {a[$1]++; next} 
       FNR==1 || p!=$1 {if(count+a[$1]>=size) {f++; count=0} 
           else count+=a[$1]; p=$1} 
           {print > "_file_"f+0}' file{,} 

$ head _f* 
==> _file_0 <== 
A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

==> _file_1 <== 
B.Y|1|1 
B.Y|1|2 

메모를 할 수있는 . 이 스크립트에서는 비분 할이 더 중요하다고 가정했습니다. 예를 들어, 동일한 입력 파일 변경의 경우 size = 1로 설정하십시오. 키는 별도의 파일로 분할되지 않지만 파일 길이는 1보다 커집니다.

+0

잘 작동합니다. 감사합니다. – Sara

+0

idk는 질문이 명확하지 않으므로 200gig 파일을 두 번 읽고 메모리에 1000 만 개 이상의 값을 저장하는 것보다 더 나은 해결책이 될 수 있습니다. printf ("_file_"f + 0)'대신에 출력 리다이렉션의 오른쪽에 괄호 안된 표현식을 사용하는 것은 POSIX 당 정의되지 않은 동작이므로 YMMV를 사용하십시오. 또한 GNU awk를 사용하지 않는 경우 "너무 많은 파일 열기"오류를 피하기 위해 출력 파일을 닫는 로직을 추가해야합니다. –

관련 문제