여기에서는 comm을 사용하여 2개의 정렬된(정렬 사용) 파일을 비교하고 하나 또는 두 파일 모두에 있는 행/레코드를 표시하는 방법을 배웠습니다.
실제로 뭔가가 예상대로 작동하지 않아서 도움을 받고 싶습니다.
각각 약 200,000개의 레코드가 있는 여러 개의 정렬된 파일이 있고 일부 행은 공통적입니다. 이전에 정렬된 두 파일 모두에 나타납니다. 그런 다음 다음 명령을 실행하십시오.
comm -i -23 file1 file2 > test_01
매우 간단합니다. test_01에 레코드/행이 있을 것으로 예상됩니다.오직file1에 나타납니다. 그러나 출력(test_01)에는 두 파일 모두에 존재하는 행/레코드가 포함되어 있습니다.
두 파일 모두 일반 이메일 주소(열당 하나의 열)만 포함합니다. 위에서 언급했듯이 이전에는 정렬 유틸리티를 사용하여 정렬이 수행되었습니다. 각 파일에는 서로 다른 레코드 수가 있습니다. test_01 출력 파일에 file1 및 file2에 존재하는 레코드가 포함되어 있는지 확인하십시오(grep 사용).
위의 프로세스 설명에 따르면 제가 뭔가 잘못하고 있는 걸까요?
답변1
다음 예를 고려하십시오.
$ comm -23 L R > Z
$ head -n 9999 L R Z
==> L <==
Easy one
Easy one
Final Two
==> R <==
Easy one
Final Two
==> Z <==
Easy one
$
Easy one
해당 텍스트가 두 파일 모두에 나타나더라도 "만"이 포함된 열 1이 나열됩니다 . 한 쌍은 일치하고 두 번째 쌍은 파일 L에서만 추가 줄입니다. 세 개의 열을 모두 나열하면 이는 분명해집니다.
$ comm L R
Easy one
Easy one
Final Two
$
Linux에서는 이 옵션을 테스트할 수 없었지만 -i
작동하지 않을 것이라고 의심할 이유가 없습니다. 그러나 입력을 대소문자별로 정렬한 다음 대소문자 구분 없이 비교할 수 있는 옵션이 sort
없습니다 .-i
tr 'a-z' 'A-Z' | sort | uniq
차이점을 확인하기 전에 각 파일을 전달하는 것이 좋습니다 .comm
실제 데이터 몇 줄을 보여주고 몇 줄만 사용하여 예제를 분리할 수 있다면 도움이 될 것입니다. 공백(공백, 탭, CR)은 결과에 미묘하게 영향을 미칠 수 있습니다.
awk
더 나은 선택일 수도 있습니다. 배열을 사용하면 정렬되지 않은 데이터를 비교하고, 공백의 균형을 맞추고, 대소문자를 무시하고, 원래 줄 번호와 데이터를 계속 보고할 수 있습니다.