두 텍스트 파일의 공통 라인(유사성)을 출력하시겠습니까(diff와 반대)?

두 텍스트 파일의 공통 라인(유사성)을 출력하시겠습니까(diff와 반대)?

Diff는 두 파일 간의 변경 사항을 표시하는 훌륭한 도구입니다. 그러나 차이점을 무시하면서 두 텍스트 파일의 유사점을 표시하는 방법은 무엇입니까?

즉, 샘플 입력:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

의사 출력(이와 유사):

@@ 2,3
=Hello World

이 경우 라인 정보가 손실되므로 두 파일을 모두 정렬하고 comm을 사용하는 것만으로는 충분하지 않습니다.

답변1

grep -Fxf file1 file2

-F일반 문자열(정규식이 아님)과 일치한다는 의미, -x전체 줄만 일치한다는 의미, -f인수라는 이름의 파일에서 "패턴"(즉, 줄)을 가져오는 것을 의미합니다.

답변2

diff가 필요하지 않더라도 diff를 사용하는 것은 어떨까요? 이 시도:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

샘플 데이터에서 얻은 내용은 다음과 같습니다.

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World

답변3

comm사용할 수 있습니다. 모든 옵션에 대해 두 입력 모두에 존재하는 행만 표시 man comm하려고 합니다 .comm -12 ...

사람들이 지적했듯이 sort먼저 입력을 전달해야 합니다.

답변4

Dick Grune은 이런 종류의 도구를 작성했습니다.

http://dickgrune.com/Programs/similarity_tester/

다양한 언어의 구문을 구문 분석하는 버전이 있으므로 변수 이름 변경과 같은 작업은 변경되지 않은 것으로 처리될 수 있습니다.

similarity-testerDebian 및 Ubuntu와 동일한 방식 으로 패키지되어 있습니다 .

관련 정보