두 개의 큰 파일(각각 2gig)이 나열되고 무작위로 정렬되어 있습니다. 두 파일 사이의 차이점을 찾아 출력 파일에 써야 합니다.
파일 1:
abc1234
def4321
ghi1234
파일 2:
ghi1234
jk16754
abc1234
mnop3847
산출:
def4321
jk16754
mnop3847
답변1
$ join -v 1 -v 2 <( sort file-1 ) <( sort file-2 )
def4321
jk16754
mnop3847
join
정렬된 입력 파일에 대해 관계형 JOIN 작업을 수행합니다(각 파일의 첫 번째 탭을 사용하여 열을 구분하지만 이는 명령줄에서 변경할 수 있습니다. 매뉴얼 참조). 기본적으로 일치하는 데이터를 출력하지만 -v 1
및 를 사용하면 -v 2
각 파일에서 일치하는 줄을 얻을 수 있습니다.아니요다른 파일의 것과 일치합니다.
쉘이 프로세스 대체 사용을 지원하지 않는 경우 <(...)
미리 파일을 정렬하십시오. 명령을 여러 번 실행하거나 파일에 대해 다른 작업을 수행하려는 경우 이 작업을 수행할 수 있습니다.
$ sort -o file-1.sorted file-1
$ sort -o file-2.sorted file-2
$ join -v 1 -v 2 file-[12].sorted
답변2
comm
와 의 조합으로 sed
귀하의 요구 사항을 충족할 수 있습니다.
comm
파일과 비교하여 3개의 열을 출력합니다. 열 1은 file1에만 있는 모든 행이고, 열 2는 file2에만 있는 모든 행이며, 열 3은 공통 행입니다.
귀하의 경우 열 3의 인쇄를 억제한 다음 sed를 사용하여 열 2 항목에서 공백을 제거하려고 합니다.
bash-[533]$ comm -3 <(sort file-1) <(sort file-2) | sed -e 's/^\s*//'
def4321
jk16754
mnop3847
comm
파일을 정렬해야 합니다. 위의 예에서는 파일을 동적으로 정렬하고 출력을 파일 설명자로 보내는 방법을 보여 주지만, 파일을 미리 정렬하면 시스템 리소스가 더 쉬울 수 있으며 다음과 같이 명령을 실행할 수 있습니다.
bash-[533]$ comm -3 file-1-sorted file-2-sorted | sed -e 's/^\s*//'
def4321
jk16754
mnop3847
답변3
그리고차이점주문하다:
diff --changed-group-format="%>%<" --unchanged-group-format="" <(sort file1) <(sort file2)
산출:
def4321
jk16754
mnop3847