파일 B에는 있지만 파일 A에는 없는 항목을 표시하지 않고 파일 A의 어떤 문자열이 파일 B에 없는지 테스트하려면 어떻게 해야 합니까?

파일 B에는 있지만 파일 A에는 없는 항목을 표시하지 않고 파일 A의 어떤 문자열이 파일 B에 없는지 테스트하려면 어떻게 해야 합니까?

다음과 같은 URL이 포함된 sitelist1.txt(파일 A)라는 텍스트 파일이 있습니다.

http://www.facebook.com
http://www.twitter.com
http://myspace.com/profile
http://orkut.com/archived

기존 URL이 많이 포함된 sitelist2.txt(파일 B)라는 또 다른 텍스트 파일이 있습니다.

나는 시도했다:

fgrep -v -f sitelist1.txt sitelist2.txt 

문제는 sitelist2.txt에는 있지만 sitelist1.txt에는 없는 URL도 표시된다는 것입니다.

답변1

전달한 내용은 예상한 것과 반대되는 작업을 수행하게 합니다. 즉, 의 모든 행에 대해 일치하는 행이 없음을 -v보여줍니다 . 그래서 중복된 콘텐츠를 많이 보게 될 것이라고 확신합니다. 옵션 없이 동일한 명령을 사용하고 싶습니다 .sitelist1.txtsitelist2.txt-v

fgrep -f sitelist1.txt sitelist2.txt

그러면 영어로 다음 명령이 실행됩니다. 의 각 줄에 대해 관심 있는 file1 줄을 포함하는 모든 줄을 전체 줄 또는 file2 줄의 일부로 sitelist1.txt표시합니다 .sitelist2.txt

-v옵션은 일치하지 않는 모든 행을 표시하는 "역방향 일치" 옵션입니다.

답변2

John의 답변(질문 아래 댓글에서 지적된 오해는 제외하고)은 질문에 대한 답변이지만, 다음과 같이 간단한 것에 대해서도 지적하고 싶습니다 combine(더 많은 유틸리티)는 좋은 선택입니다. 부울 연산자(AND, OR, NOT 및 XOR 지원)를 사용하여 수행하려는 작업을 표현할 수 있으므로 사용하기가 매우 쉽습니다.

combine sitelist1.txt NOT sitelist2.txt
% cat sitelist1.txt 
http://www.facebook.com
http://www.twitter.com
http://myspace.com/profile
http://orkut.com/archived
% cat sitelist2.txt 
http://www.facebook.com
http://www.twitter.com
http://myspace.com/profile
% combine sitelist1.txt NOT sitelist2.txt
http://orkut.com/archived

대부분의 유틸리티와 달리 입력 파일은아니요정렬이 필요하지만(여전히 내부적으로 정렬되는 것 같지만) 중복 행을 인쇄하고 싶지 않은 fgrep경우 정렬을 사용하는 데 문제가 있습니다 . 중복된 줄이 포함되어 sitelist1.txt있고 sitelist1.txt이를 인쇄하지 않으려면 combine출력을 다음으로 파이프 해야 합니다 sort -u.

combine sitelist1.txt NOT sitelist2.txt | sort -u

답변3

하위 문자열이 아닌 각 줄에서 전체 URL을 찾고 있다면 다음을 사용할 수 있습니다.comm

comm -23 <(sort -u fileA) <(sort -u fileB)

참고:
comm에는 정렬된 입력이 필요하므로 먼저 2개의 파일을 정렬하고 고유화합니다 (sort -u file).
다음 - sort -ucomm에는 파일이 필요하므로 프로세스 대체를 사용하여 의 출력을 "파일"로 comm에 전달합니다 comm <() <().
마지막으로 열 2(파일 B에 고유한 행)와 열 3(두 파일에 공통된 행)을 억제하여 열 1(파일 A에 고유한 행)의 행만 출력합니다.

관련 정보