2013-01-23 2 views

답변

101

당신이 사용해야하는 명령은 diff하지만 comm 기본적으로

comm -23 a.txt b.txt 

없는 (그래서 나중에 참조 할 수 있도록 문서화,이 질문에 대한 답을 찾기 위해 많은 시간을 보냈다) comm은 3 열을 출력합니다. 왼쪽 전용, 오른쪽 전용, 모두입니다. -1, -2-3 스위치는이 열을 억제합니다.

그래서, -23는 첫 번째 (왼쪽) 파일에 표시되는 라인을 보여주는 오른쪽에만모두 열을 숨 깁니다.

당신이에 모두 표시 줄을 찾으려면, 당신은 단지 모두 열 당신을 떠나 왼쪽 전용오른쪽에만 열을 숨 깁니다 -12를 사용할 수 있습니다.

+9

이 두 파일을 정렬 할 경우에만 작동하도록 추가 할 것입니다. (나는 OP가 그가 파일을 분류했다는 것을 안다. 그러나 많은 사람들이 나를 포함 시켰고, 질문 제목을 읽고 그 대답으로 건너 뛰었습니다.) – user247866

+1

@ user247866 : 다행히 comm은 친절하지 않아 그들이 정렬되지 않았다고 말할 수 있습니다 :) – marlar

20

comm은 줄에 일치하는 줄을 몰랐기 때문에 간단한 대답이 효과가 없었으므로 한 파일의 줄 중복이 다른 줄에 존재하지 않는 것으로 인쇄됩니다. 예를 들어, 파일 1은 포함 :

Alex 
Bill 
Fred 

그리고 파일 2 포함 :

Alex 
Bill 
Bill 
Bill 
Fred 

그런 다음 출력 할 comm -13 file1 file2 : 내 경우

Bill 
Bill 

, 내가 알고 싶어 아니라 모든 문자열 file2는 각 파일에서 해당 행이 몇 번 있었는지에 관계없이 file1에있었습니다.

해결 방법 1 : unix.stackexchange에서 (최초의 "작업"대답은 내가 발견) :

comm -13 <(sort -u file1) <(sort -u file2)

해결 방법 2 :-u (독특한) 플래그 sort에를 사용

fgrep -v -f file1 file2

file2에 dupli file1에 전혀 존재하지 않는 cate 행은 fgrep이고 중복 행은 각각 출력됩니다.단일 (상당히 큰) 데이터 세트에 대한 단일 랩톱에 대한 완전히 비 과학적 테스트는 솔루션 1 (comm 사용)이 솔루션 2 (fgrep 사용)보다 거의 5 배 빠르다는 것을 보여줍니다.

+0

I 내 파일을 분류하고 uniq을 통과 시켰습니다. 어쨌든 다른 솔루션에 감사드립니다. – Sudar

2

diff은 사용하지 않아야하는 이유가 확실하지 않습니다. 두 파일을 비교 한 다음 왼쪽 파일에있는 행만 출력하지만 오른쪽 파일에는 출력하지 않습니다. 이러한 라인은 그래서 파일이 아직 분류되지 않을 경우 라인

diff a.txt b.txt | grep \^\< 
+1

'diff --new-line-format = --unchanged-line-format = a.txt b.txt'를 사용하여 새로운 라인과 변경되지 않은 라인의 인쇄를 억제 할 수 있습니다. –

3

의 시작 부분에 해당 심볼을 grep을하기에 충분 <와 DIFF에 의해 플래그가, 당신은 사용할 수 있습니다

comm -23 <(sort a.txt) <(sort b.txt) 
관련 문제