다른 파일에는 없는 한 파일의 행을 가져올 수 있는 도구가 있습니까?

다른 파일에는 없는 한 파일의 행을 가져올 수 있는 도구가 있습니까?

파일 A에는 포함되어 있지만 파일 B에는 포함되지 않은 줄을 가져올 수 있는 도구가 있습니까? Perl 등으로 간단한 스크립트를 만들 수 있지만 비슷한 것이 이미 존재한다면 지금부터 시간을 절약하겠습니다.

답변1

예. 파일에서 텍스트 문자열을 검색하기 위한 표준 도구를 grep사용하여 한 파일의 모든 줄을 다른 파일에서 뺄 수 있습니다.

grep -F -x -v -f fileB fileA

이는 fileB의 각 행을 패턴으로 사용하고( -f fileB) 이를 일치시킬 일반 문자열(정규 정규식이 아님)로 처리하여 -F수행됩니다 ( ). 전체 줄에서 일치가 -x발생하도록 강제하고( ) 일치하지 않는 줄만 인쇄합니다( -v). 따라서 인쇄하는 fileA의 행에는 fileB의 행과 동일한 데이터가 포함되어 있지 않습니다.

이 솔루션의 단점은 행 순서를 고려하지 않으며 입력의 다른 위치에 중복 행이 있는 경우 예상한 결과를 얻지 못할 수 있다는 것입니다. 해결책은 실제 비교 도구(예: diff. 파일 A를 파일 B로 변환하는 중입니다. (이 명령은 포맷 후 올바른 행을 얻기 위해 diff도 제거합니다.)

diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC

답변2

대답은 비교하는 파일의 유형과 형식에 따라 크게 달라집니다.

비교하려는 파일이 정렬된 텍스트 파일인 경우 Richard Stallman과 Davide McKenzie가 작성한 GNU 도구가 호출됩니다.comm원하는 필터링을 수행할 수 있습니다. coreutils의 일부입니다.

다음과 같은 2개의 파일이 있다고 가정해 보겠습니다.

$ cat a
1
2
3
4
5

$ cat b
1
2
3
4
5
6

b파일에 존재하지 않는 파일의 행 a:

$ comm <(sort a) <(sort b) -3
    6

답변3

~에서스택 오버플로...

통신-23 파일1 파일2

-23 file2의 줄(-2)과 두 줄 모두(-3)에 나타나는 줄을 억제하고 file1의 고유한 줄만 남깁니다. 파일은 정렬되어야 하지만(예제에 나와 있음) 그렇지 않은 경우 먼저 정렬을 통해 파이프하십시오.

매뉴얼 페이지를 참조하세요여기

-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
-3 suppress column 3 (lines that appear in both files)

답변4

파일이 크고 항목에 사용자 정의 순서가 없으면 grep에 시간이 너무 오래 걸립니다. 빠른 대안은

sort file1 > 1 
sort file2 > 2 
diff 1 2 | grep "\>" | sed -e 's/> //'

[file2-file1 결과가 화면에 표시되고 파일로 파이프되는 등]

>로 변경하면 <반대의 뺄셈이 이루어집니다.rm 1 2

관련 정보