파일의 모든 줄이 다른 파일에 나타나는지 확인

파일의 모든 줄이 다른 파일에 나타나는지 확인

두 개의 파일이 있습니다. file1에는 약 10,000줄이 있고, file2에는 수백 줄이 있습니다. file2의 모든 행이 file1에 있는지 확인하고 싶습니다. 즉: ∀ 행 ℓ ∈ file2 : ℓ ∈ file1

이 기호가 무엇을 의미하는지 또는 "file2의 모든 행이 file1에 있는지 확인"이 무엇을 의미하는지 모르는 사람이 있는 경우: 두 파일의 여러 동등한 행은 반환된 파일이 요구 사항을 충족하는지 확인하는 데 영향을 미치지 않습니다.

어떻게 해야 하나요?

답변1

comm -13 <(sort -u file_1) <(sort -u file_2)

이 명령은 을 출력합니다 file_2. 따라서 출력이 비어 있으면 모든 file_2줄이 file_1.

특파원 :

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

답변2

[ $(grep -cxFf file2 <(sort -u file1)) = $(sort -u file2 | wc -l) ] && 
  echo all there || 
  echo some missing

file2의 일치 항목 수(file1의 고유 라인)가 file2의 고유 라인 수와 동일하면 둘 다 존재하고 그렇지 않으면 존재하지 않습니다.

답변3

GNU를 사용하면 특정 기능(및 기타 구현도 awk가능)을 지원하며 파일이 정렬된 경우에는 필요하지 않습니다.length(array)awk

gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1

이것은 독서이다파일 2seen다음과 같은 전체 줄로 키를 사용하여 호출된 파일을 넣으세요 .파일 2.

그럼 읽어봐파일 1각 행에 대해 표시된 배열의 행과 일치하면 해당 키를 삭제합니다.

마지막으로 배열이 비어 있으면 모든 행을 의미합니다.파일 2존재하다파일 1그리고 인쇄할 것입니다Matched그렇지 않으면 표시됩니다Not Matched.


모든 구현의 호환성을 위해 awk.

awk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{for(x in seen);print (!x)?"Matched":"Not Matched"}' file2 file1

다음과 같은 경우에만 빈 줄/공백이 있는 줄을 무시하세요.파일 2, 배열로 읽는 것을 건너뛰려면 NF조건을 추가해야 합니다 .NR==FNR && NF {...

답변4

diff -q <(sort -u file2) <(grep -Fxf file2 file1 | sort -u)

file1포함되면 출력이 생성되지 않습니다.모든 라인file2상태를 입력 하고 종료합니다 0. 그렇지 않으면 이와 같은 내용이 인쇄됩니다.

Files /proc/self/fd/11 and /proc/self/fd/12 differ

및 종료 상태1

관련 정보