파일 간의 차이를 확인하는 방법

파일 간의 차이를 확인하는 방법

비슷한 stackoverflow 커뮤니티의 다른 링크를 찾았지만 내 질문에 정확히 대답하지 않았습니다.

줄 수가 다른 2개의 파일이 있지만 둘 다 정렬했습니다. 내 원본 파일의 길이는 수백 줄이지만 문제 해결을 위해 file1에는 12줄, file2에는 5줄로 만들었습니다. File2는 file1의 하위 집합입니다. 내가 하고 싶은 것은 file1에는 있지만 file2에는 없는 모든 줄을 출력하는 명령을 실행하는 것입니다.

Unix 명령을 사용해 보았 diff으나 comm둘 다 file1의 전체 내용을 나열했는데 이는 내가 원하는 것이 아닙니다.

이에 대한 간단한 예는 다음과 같습니다.

File1      File2
A           B
B           E
C           I
E           N
G           O
I
L
M
N
O
X

여기서는 file2에 있는 모든 내용이 file1에 있는 것을 볼 수 있습니다. 어떤 이유로 두 diff파일 comm모두 file1의 전체 내용을 표시했습니다. 나는 그것이 한 줄씩 비교를 수행하고 전체 파일을 검색하지 않기 때문이라고 가정합니다.

내가 기대하는 결과를 출력하는 또 다른 Unix 명령이 있습니까?

편집: 필요한 것을 얻기 위해 사용한 명령은 다음과 같습니다.

a) 차이점 파일1 파일2

이것은 기본적으로 file1의 모든 항목을 앞에 <로 나열하여 내용이 file1의 내용임을 보여주고, file2의 모든 항목 앞에 >가 있는 것을 나타냅니다. 분명 나한테 필요한 건 아니었어

b) 통신 -23 파일1 파일2

이것은 내가 기대했던 차이점이 아닌 file1의 전체 내용을 다시 보여주었습니다. 나도

c) 통신 -3 파일1 파일2

comm의 도움말 페이지에서는 이것이 파일 1의 행을 인쇄하지만 파일 2의 행은 인쇄하지 않으며 그 반대의 경우도 마찬가지라고 말했지만 이것은 또한 내 예에서 b/c를 원하는 것을 표시하지 않았습니다. B는 두 파일 모두에 있지만 다른 행에 나타납니다. 그러나 출력은 하나에는 있지만 다른 하나에는 없다고 생각하여 인쇄합니다. 그래서 출력은 다음과 같았습니다.

A
B
    B
C
E
    E
etc.

그리고 그것은 내가 기대했던 것이 아니 었습니다. 나는 기대하고 있었다

A
C
G
L
M
X

답변1

그렇게 하려면 파일 A에서 파일 b의 내용을 grep으로 반대로 하면 됩니다.

예 :

francois@zaphod:/tmp$
 cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
 cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
  grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$

여기서 출력은 파일 b에 존재하지 않는 파일 A의 행만입니다.

답변2

Diff 출력은 파일 X가 파일 Y가 되기 위해 수행해야 할 작업을 보여줍니다.

귀하의 의견에 따르면 다음 oneliner를 사용할 수 있습니다.

cat x y | sort -u  | cat y - | sort | uniq -u

그럴 것이다

  1. 두 파일 모두 읽기
  2. 이를 리조트하고 고유한 줄만 인쇄합니다( -u정렬).
  3. 파일(y)을 읽고 파이프된 출력과 결합합니다.
  4. 리조트 출력
  5. uniq를 사용하면 한 번만 표시되는( -u고유하게) 줄만 사용됩니다.

이 방법은 집합 이론을 기반으로 합니다. 먼저 두 세트를 더한 다음 그 중 하나를 뺍니다.

답변3

파일 중 하나가 DOS 형식의 텍스트 파일이고 다른 파일이 Unix 형식의 텍스트 파일인 경우 해당 줄의 문자가 동일하더라도 각 줄은 다른 파일의 모든 줄과 다릅니다. 이는 한 파일의 각 줄 끝에 다른 파일에는 없는 추가 캐리지 리턴 문자가 있기 때문입니다.

comm -3 file1 file2when은 file1Unix 텍스트 파일 이고 DOS 텍스트 파일은 다음과 같은 결과가 나올 것으로 예상됩니다 file2(이것이 여러분이 가지고 있는 것입니다).

A
B
        B
C
E
        E
G
I
        I
L
M
N
        N
O
        O
X

comm -3 file1 file2언제 file1is DOS 텍스트 파일이고 file2is a Unix 텍스트 파일인지 에 대한 다음 출력이 예상됩니다 .

A
        B
B
C
        E
E
G
        I
I
L
M
        N
N
        O
O
X

두 파일 모두 동일한 줄 끝을 갖는 경우, 즉 둘 다 DOS 텍스트 파일이거나 둘 다 Unix 텍스트 파일인 경우 출력은 다음과 같을 것으로 예상됩니다 comm -3 file1 file2.

A
C
G
L
M
X

다음 명령을 사용하여 두 파일을 모두 Unix 텍스트 형식으로 변환할 수 있습니다.

dos2unix file1 file2

... 유틸리티가 설치되어 있는 경우 dos2unix.

관련 정보