IT박스

공통 라인을 표시하는 방법 (역방향 diff)?

itboxs 2020. 5. 31. 21:10
반응형

공통 라인을 표시하는 방법 (역방향 diff)?


일련의 텍스트 파일이 있는데 서로 다른 줄보다는 공통 줄을 알고 싶습니다. 커맨드 라인 유닉스 나 창은 괜찮습니다.

foo :

linux-vdso.so.1 =>  (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)

바:

libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 =>  (0x00007fffccffe000)

따라서이 두 파일 위에 원하는 유틸리티의 출력이 비슷할 것입니다 file1:line_number, file2:line_number == matching text(단지 제안하면 구문이 무엇인지 상관하지 않습니다).

foo:1, bar:3 == linux-vdso.so.1 =>  (0x00007fffccffe000)

감사.


* nix에서는 comm 을 사용할 수 있습니다 . 질문에 대한 답변은 다음과 같습니다.

comm -1 -2 file1.sorted file2.sorted 
# where file1 and file2 are sorted and piped into *.sorted

전체 사용법은 다음과 같습니다 comm.

comm [-1] [-2] [-3 ] file1 file2
-1 Suppress the output column of lines unique to file1.
-2 Suppress the output column of lines unique to file2.
-3 Suppress the output column of lines duplicated in file1 and file2. 

또한 man 페이지에서 언급 한 것처럼 comm을 사용하기 전에 파일을 정렬하는 것이 중요합니다.


중복으로 나열된 질문 에서이 답변을 찾았습니다 . 나는 grep을 comm보다 관리하기 쉽기 때문에 일치하는 행 세트를 원한다면 (예 : CSV 비교에 유용) 간단히 사용하십시오.

grep -F -x -f file1 file2

또는 단순화 된 fgrep 버전

fgrep -xf file1 file2

또한 file2*두 개가 아닌 여러 파일에 공통 인 행을 찾아서 찾는 데 사용할 수 있습니다 .

다른 편리한 변형은 다음과 같습니다.

  • -n 일치하는 각 줄의 줄 번호를 표시하는 플래그
  • -c 일치하는 줄 수만 계산
  • -vfile2 에서 다른 행만 표시합니다 (또는 사용 diff).

사용 comm속도는 빠르지 만 파일 속도를 먼저 정렬해야하는 비용이 발생합니다. '역방향 diff'로는 그다지 유용하지 않습니다.


이전에 여기에 물었습니다 : 두 파일에서 공통적 인 줄을 찾는 유닉스 명령

펄로 시도해 볼 수도 있습니다 (신용 은 여기로갑니다 )

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

방금이 스레드에서 comm 명령을 배웠지 만 추가 항목을 추가하고 싶었습니다. 파일이 정렬되지 않고 원본 파일을 건드리지 않으려는 경우 sort 명령의 출력을 파이프 할 수 있습니다. 원본 파일은 그대로 유지됩니다. bash에서 작동하지만 다른 쉘에 대해서는 말할 수 없습니다.

comm -1 -2 <(sort file1) <(sort file2)

파일 대신 명령 출력을 비교하도록 확장 할 수 있습니다.

comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)

가장 쉬운 방법은 다음과 같습니다.

awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2

파일을 정렬 할 필요는 없습니다.


정보를 얻기 위해 Windows 용 "grep -F -x -f file1 file2"와 동일한 작업을 수행하는 작은 도구를 만들었습니다 (Windows 에서이 명령과 동등한 것을 찾지 못 했으므로)

여기 있습니다 : http://www.nerdzcore.com/?page=commonlines

사용법은 "CommonLines inputFile1 inputFile2 outputFile"입니다.

소스 코드도 사용 가능 (GPL)

참고 URL : https://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff

반응형