Unix 명령은 두 파일에서 공통적 인 행을 찾습니다.



Answers

정렬되지 않은 파일에 comm 명령을 쉽게 적용하려면 Bash의 프로세스 대체를 사용하십시오 .

$ bash --version
GNU bash, version 3.2.51(1)-release
Copyright (C) 2007 Free Software Foundation, Inc.
$ cat > abc
123
567
132
$ cat > def
132
777
321

따라서 파일 abc와 def는 한 줄, 즉 "132"와 공통점이 있습니다. 정렬되지 않은 파일에 대한 통신 사용 :

$ comm abc def
123
    132
567
132
    777
    321
$ comm -12 abc def # No output! The common line is not found
$

마지막 줄에 출력이 없으므로 공통 줄이 발견되지 않았습니다.

이제 comm 을 사용하여 정렬 된 파일에서 프로세스 대체로 파일을 정렬합니다.

$ comm <( sort abc ) <( sort def )
123
            132
    321
567
    777
$ comm -12 <( sort abc ) <( sort def )
132

이제 우리는 132 라인을 얻었습니다!

Question

두 개 이상의 파일에서 공통 줄을 인쇄 할 수있는 유닉스 명령을 발견 한 사람은 누구일까요? diff 보다 훨씬 간단했습니다.




제한된 버전의 Linux (예 : QNAP (nas)) :
- 통신이 존재하지 않았다.
- grep -f file1 file2 는 @ChristopherSchultz에서 말한 것처럼 몇 가지 문제를 일으킬 수 있으며 grep -F -f file1 file2 를 사용하면 20MB가 넘는 파일에 대해 2-3 초에 걸리는 속도가 매우 느립니다 (5 분 이상 - 완료되지 않았습니다). )

그래서 여기에 내가 한 일이 있습니다.

sort file1 > file1.sorted
sort file2 > file2.sorted

diff file1.sorted file2.sorted | grep "<" | sed 's/^< *//' > files.diff
diff file1.sorted files.diff | grep "<" | sed 's/^< *//' > files.same.sorted

"files.same.sorted"가 원래 순서와 동일한 순서로되어 있으면 file1과 같은 순서로이 행을 추가하십시오.

awk 'FNR==NR {a[$0]=$0; next}; $0 in a {print a[$0]}' files.same.sorted file1 > files.same

또는 file2와 같은 순서로 :

awk 'FNR==NR {a[$0]=$0; next}; $0 in a {print a[$0]}' files.same.sorted file2 > files.same




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



두 파일이 아직 정렬되지 않은 경우 다음을 사용할 수 있습니다.

comm -12 <(sort a.txt) <(sort b.txt)

comm: file 2 is not in sorted order comm -12 a.txt b.txt 수행 할 때 comm: file 2 is not in sorted order .




Perl one-liner를 보완하기 위해 awk 와 동일한 기능을 제공합니다.

awk 'NR==FNR{arr[$0];next} $0 in arr' file1 file2

그러면 file1 모든 행을 arr[] 배열로 읽어 file1 다음 file2 각 행이 이미 배열 (예 : file1 )에 있는지 확인합니다. 찾은 행은 file2 나타나는 순서대로 인쇄됩니다. in arr 의 비교 in arr file2 의 전체 행을 인덱스의 인덱스로 사용하므로 전체 행에 대해서만 정확한 일치를보고합니다.




Links