두 파일 (모두 a.txt
및 b.txt
)에 이름 목록이 있습니다. 나는 이미 두 파일 모두에서 sort
을 실행했다.파일에서 다른 파일에없는 행 찾기
b.txt
에없는 a.txt
의 줄을 찾고 싶습니다.
두 파일 (모두 a.txt
및 b.txt
)에 이름 목록이 있습니다. 나는 이미 두 파일 모두에서 sort
을 실행했다.파일에서 다른 파일에없는 행 찾기
b.txt
에없는 a.txt
의 줄을 찾고 싶습니다.
당신이 사용해야하는 명령은 diff
하지만 comm
기본적으로
comm -23 a.txt b.txt
없는 (그래서 나중에 참조 할 수 있도록 문서화,이 질문에 대한 답을 찾기 위해 많은 시간을 보냈다) comm
은 3 열을 출력합니다. 왼쪽 전용, 오른쪽 전용, 모두입니다. -1
, -2
및 -3
스위치는이 열을 억제합니다.
그래서, -23
는 첫 번째 (왼쪽) 파일에 표시되는 라인을 보여주는 오른쪽에만 및 모두 열을 숨 깁니다.
당신이에 모두 표시 줄을 찾으려면, 당신은 단지 모두 열 당신을 떠나 왼쪽 전용 및 오른쪽에만 열을 숨 깁니다 -12
를 사용할 수 있습니다.
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 배 빠르다는 것을 보여줍니다.
I 내 파일을 분류하고 uniq을 통과 시켰습니다. 어쨌든 다른 솔루션에 감사드립니다. – Sudar
diff
은 사용하지 않아야하는 이유가 확실하지 않습니다. 두 파일을 비교 한 다음 왼쪽 파일에있는 행만 출력하지만 오른쪽 파일에는 출력하지 않습니다. 이러한 라인은 그래서 파일이 아직 분류되지 않을 경우 라인
diff a.txt b.txt | grep \^\<
'diff --new-line-format = --unchanged-line-format = a.txt b.txt'를 사용하여 새로운 라인과 변경되지 않은 라인의 인쇄를 억제 할 수 있습니다. –
의 시작 부분에 해당 심볼을 grep을하기에 충분 <
와 DIFF에 의해 플래그가, 당신은 사용할 수 있습니다
comm -23 <(sort a.txt) <(sort b.txt)
이 두 파일을 정렬 할 경우에만 작동하도록 추가 할 것입니다. (나는 OP가 그가 파일을 분류했다는 것을 안다. 그러나 많은 사람들이 나를 포함 시켰고, 질문 제목을 읽고 그 대답으로 건너 뛰었습니다.) – user247866
@ user247866 : 다행히 comm은 친절하지 않아 그들이 정렬되지 않았다고 말할 수 있습니다 :) – marlar