파일 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