두 파일 비교

두 파일 비교

주요 부분이 유사하지만 혼란스러운 두 파일을 비교할 수 있는 방법을 제안해 주십시오. 예:

A file가지다

72444 55555
72445 55666
55666 72446

B File가지다

72444 55555
55666 72446
72445 55666
xxxxx yyyyy

그래서 출력 파일 파일과 오류가 발생한 파일 이름의 차이를 얻고 싶습니다. 위의 나머지 부분이 동일하다면 아마도 다음과 같을 것입니다.

B File xxxxx yyyyy

답변1

comm유틸리티는 두 파일 중 하나에 고유하거나 두 파일 모두에 공통적인 행을 추출할 수 있습니다. 이 유틸리티를 사용하려면 두 파일을 모두 정렬해야 하므로 "복잡한 줄" 문제가 해결됩니다.

유틸리티 comm의 기본 출력은 탭으로 구분된 세 개의 열로 구성됩니다.

  1. 첫 번째 파일에서만 행이 발견됩니다.
  2. 두 번째 파일에서만 행이 발견됩니다.
  3. 두 파일 모두에서 줄이 발견되었습니다.

열을 활성화 -1하거나 비활성화할 수 있습니다 .-2-3

여기서는 두 가지 프로세스 대체를 사용하여 정렬된 입력 데이터를 생성 comm하고 두 파일에 고유한 데이터인 처음 두 열만 표시하도록 요청합니다.

$ comm -3 <(sort fileA) <(sort fileB)
        xxxxx yyyyy
$ comm -3 <(sort fileA) <(sort fileB) | cut -f 2-
xxxxx yyyyy

보시다시피, 두 번째 열은 무언가를 포함하는 유일한 열이므로 이 행은 xxxxx yyyyy에만 나타나고 fileB다른 모든 행은 두 파일에 공통된다는 결론을 내릴 수 있습니다.

그렇지 않은 경우 -3세 번째 열에서도 공통점을 확인할 수 있습니다.

$ comm <(sort fileA) <(sort fileB)
                55666 72446
                72444 55555
                72445 55666
        xxxxx yyyyy

답변2

의 경우 zsh배열 빼기 연산자를 사용할 수 있습니다.

$ a='A file' b='B file'
$ al=( ${(f)"$(<$a)"} ) bl=( ${(f)"$(<$b)"} )
$ print -rC1 -- "$a "${^al:|bl} "$b "${^bl:|al}
B file xxxxx yyyyy

어디:

  • $(<file)file줄 바꿈 없이 콘텐츠로 확장
  • ${(f)expansion}빈 요소를 버리고 새 줄로 분할하므로 및 각각에 대해 비어 있지 않은 줄이 $al포함됩니다 .$blA fileB file
  • ${a:|b}(배열 빼기) a에도 포함된 요소(막대)를 제외하고 배열 요소로 확장됩니다 .b
  • text${^array}대신 array=(a b)에 확장할 때 여기서는 배열 빼기 결과의 요소에 파일 이름 접두사를 사용합니다.texta textbtexta b
  • print -rC1 -- print열 s의 각 매개변수 raw1 C

두 파일에 동일한 줄이 여러 번 나타나면 두 파일의 발생 횟수가 다르더라도 보고되지 않습니다.

관련 정보