"분할"을 사용하여 파일을 줄 수로 구분 한 다음 개별 파일로 출력하여 개별적으로 처리합니다 (추천). 줄 번호에 따라 파일의 일부만 처리하는 여러 개의 "awk"명령을 수행 할 수 있습니다.
$ cut -f3,4,5,6 original.tsv | awk 'BEGIN { FS="\t" }; (NR < 50000){ print $2"\t"$1"\t"$3"\t"$4 }' > abridged01.tsv
$ cut -f3,4,5,6 original.tsv | awk 'BEGIN { FS="\t" }; ((NR >= 50000) && (NR < 100000)){ print $2"\t"$1"\t"$3"\t"$4 }' > abridged02.tsv
$ cut -f3,4,5,6 original.tsv | awk 'BEGIN { FS="\t" }; ((NR >= 100000) && (NR < 150000)){ print $2"\t"$1"\t"$3"\t"$4 }' > abridged03.tsv
NR은 현재 줄 번호를 포함하는 "awk"에 대한 내부 변수입니다. 각 명령은 해당 범위의 행만 처리합니다. 그러나 , 그들은 모두 계산해야하기 때문에 모두 다른 라인을 거치게됩니다. IO 병목 현상에 빠질 수 있기 때문에 도움이되지 않을 것이라고 확신합니다. 그러나 여러 프로세스가 있으므로 원하는 경우 여러 CPU를 사용할 수 있습니다. ;-)
이제, IF 는 바이트 단위로 같은 길이의 모든 라인을 가지고, 당신은 분명히 진정한 병렬화 할 수 있습니다. 이 경우 "dd"를 사용하여 각 "awk"프로세스의 정확한 부분을 추출합니다. 당신은 비슷한 것을 할 것입니다 :
dd if=original.tsv bs=30 count=50000 skip=0 | cut -f3,4,5,6 | awk 'BEGIN { FS="\t" }; { print $2"\t"$1"\t"$3"\t"$4 }' > abridged01.tsv
dd if=original.tsv bs=30 count=50000 skip=50000 | cut -f3,4,5,6 | awk 'BEGIN { FS="\t" }; { print $2"\t"$1"\t"$3"\t"$4 }' > abridged02.tsv
dd if=original.tsv bs=30 count=50000 skip=100000 | cut -f3,4,5,6 | awk 'BEGIN { FS="\t" }; { print $2"\t"$1"\t"$3"\t"$4 }' > abridged03.tsv
여기서 30은 각 줄의 바이트 수입니다. 당신의 라인 바이트 모두 같은 크기되지 않습니다 (가장 가능성이있는) 경우 하지만 당신이 정확한 라인의 당신의 블록이 시작 바이트과 끝을 알고, 당신은 여전히 DD를 사용 할 수 있습니다. 매개 변수를 연구하십시오. 마지막으로, 블록의 시작과 끝을 모르는 경우 추가 awk 명령으로 블록을 찾을 수 있습니다. 그러나 파일에 추가로 전체 읽기가 추가됩니다. original.tsv 파일을 다른 방식으로 여러 번 처리하지 않는 한 사전 처리 (라인 블록이 시작하고 끝나는 바이트 계산) 및 처리 (확실히 약간의 이득이있을 것이므로 아마도 더 많은 시간을 소비 할 것입니다) 이미 알고있는 솔루션을 사용했을 때보 다 IO 병목 현상이 발생했습니다.
어쨌든 이제 정보와 옵션이 있습니다. ;-) 행운을 빕니다! (와이)