수천 개의 정렬된 파일을 연결하고 출력 파일을 빠르게 재정렬합니다.

수천 개의 정렬된 파일을 연결하고 출력 파일을 빠르게 재정렬합니다.

약 100,000개의 파일이 있으며 각 파일에는 다음과 같은 고유한 줄이 있습니다.

파일 1.txt

chr1_1_200  
chr1_600_800  
...

파일 2.txt

chr1_600_800  
chr1_1000_1200  
...

파일 3.txt

chr1_200_400    
chr1_600_800  
chr1_1000_1200  
...  

각 파일에는 명령을 실행할 때 약 3천만 줄이 있습니다.

cat *txt | sort -u > Unique_Position.txt

시스템에 메모리가 부족합니다. Linux에서 일반 명령줄을 사용하여 이 문제를 처리하는 방법은 무엇입니까?

답변1

파일이 이미 허용 가능한 방식으로 정렬되어 있는 경우 병합 정렬을 한 다음 uniq정렬할 수 있습니다.

sort -t_ -k2,2n -k3,3n -m -- *.txt | uniq > Unique_Position.txt

...두 번째 필드(밑줄로 구분 _)에서 숫자로 정렬하고, 키가 고유한 경우 세 번째 필드를 기준으로 정렬합니다. 그런 다음 결과 출력이 파이프되어 uniq출력 파일로 리디렉션됩니다.

위의 (짧은) 예제 입력을 고려하면 결과는 다음과 같습니다.

chr1_1_200
chr1_200_400
chr1_600_800
chr1_1000_1200

유지하려는 행의 정렬 필드를 완전히 지정할 수 있는 경우 다음 옵션을 sort추가하여 모든 작업을 수행할 수 있습니다.-u

sort -t_ -k1 -k2,2n -k3,3n -m -u *.txt > Unique_Position.txt

이렇게 하면 호출 없이 나열된 세 필드 사이에 고유한 행이 유지됩니다 uniq(옵션이 추가되었습니다 -u). 이러한 정렬 필드는 입력 파일이 정렬되는 방식과 일치해야 합니다.

관련 정보