[shell] 두 파일을 한 줄씩 비교하고 다른 파일에서 차이 생성

file1을 file2와 비교하고 file2에없는 file1의 줄을 포함하는 file3을 생성하고 싶습니다.



답변

diff (1)은 답이 아니지만 comm (1)은 답입니다.

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

...

       -1     suppress lines unique to FILE1

       -2     suppress lines unique to FILE2

       -3     suppress lines that appear in both files

그래서

comm -2 -3 file1 file2 > file3

입력 파일을 정렬해야합니다. 그렇지 않은 경우 먼저 정렬하십시오. 이것은 임시 파일로 할 수 있습니다.

comm -2 -3 <(sort file1) <(sort file2) > file3

쉘이 프로세스 대체를 지원하는 경우 (bash는 지원함).


답변

Unix 유틸리티 diff는 정확히이 목적을위한 것입니다.

$ diff -u file1 file2 > file3

옵션, 다른 출력 형식 등은 설명서와 인터넷을 참조하십시오.


답변

이것을 고려하십시오 :
파일 a.txt :

abcd
efgh

b.txt 파일 :

abcd

다음과 같은 차이점을 찾을 수 있습니다.

diff -a --suppress-common-lines -y a.txt b.txt

출력은 다음과 같습니다.

efgh 

다음을 사용하여 출력 파일 (c.txt)의 출력을 다시 추출 할 수 있습니다.

diff -a --suppress-common-lines -y a.txt b.txt > c.txt

이것은 귀하의 질문에 답할 것입니다.

“… file2에없는 file1의 행을 포함합니다.”


답변

때로는 diff필요한 유틸리티이지만 때로는 join더 적절합니다. 파일은 미리 정렬되어야하며 bash, ksh 또는 zsh와 같은 프로세스 대체를 지원하는 쉘을 사용하는 경우 즉시 정렬을 수행 할 수 있습니다.

join -v 1 <(sort file1) <(sort file2)


답변

시험

sdiff file1 file2

일반적으로 대부분의 경우 훨씬 더 잘 작동합니다. 줄 순서가 중요하지 않은 경우 (예 : 일부 텍스트 구성 파일) 파일을 먼저 정렬 할 수 있습니다.

예를 들면

sdiff -w 185 file1.cfg file2.cfg


답변

coreutils로이 문제를 해결해야하는 경우 허용되는 답변이 좋습니다.

comm -23 <(sort file1) <(sort file2) > file3

정렬이나 처리 대체가 필요하지 않고 무한 스트림을 지원 하는 sd (stream diff) 도 사용할 수 있습니다 .

cat file1 | sd 'cat file2' > file3

아마도이 예에서 그다지 많은 이점은 아니지만 여전히 고려하십시오. 어떤 경우에는 comm또는 을 사용할 수 grep -F없습니다 diff.

여기에 sd를 소개하는 터미널의 diffing stream에 대해 쓴 블로그 포스트가 있습니다.


답변

그러나 grep해결책이 없습니까?

  • file2에만있는 행 :

    grep -Fxvf file1 file2 > file3
  • file1에만있는 행 :

    grep -Fxvf file2 file1 > file3
  • 두 파일에 모두있는 줄 :

    grep -Fxf file1 file2 > file3