두 개의 파일이 있습니다.
find
파일을 나열하고, 숫자로 정렬하고, 파일에 쓰기 위해 폴더의 명령을 사용하여 생성된 파일입니다 .- 다른 하나는 Python 스크립트에 의해 생성되었으며 정렬되지 않았으므로 명시적으로 숫자로 정렬했습니다.
문제는 내 sort
출력에 다음과 같은 두 개의 열만 있다는 것입니다.
500016
500016
500174
500174
500277
500277
보시다시피 공통 항목도 두 열에 단독으로 표시되고 세 번째 열은 완전히 누락되었습니다. 즉, 두 파일 간에 공통점이 없지만 처음 세 항목은 실제로 동일합니다.sort
그렇지 않으면 예상대로 작동합니다.그리고 제가 만든 테스트 파일도 있습니다.
나는 comm
두 파일을 모두 사전순으로 정렬해야 한다는 것을 알고 있습니다. 다음은 제가 시도했지만 실패한 옵션 목록입니다.
comm <(sort file1.txt) <(sort file2.txt)
~에서https://unix.stackexchange.com/a/377689/187419실패. 또한 명시적으로 -d
옵션을 제공하려고 시도했으며 sort
사전 정렬을 사용하여 파일을 명시적으로 다시 작성해 보았지만 둘 다 작동하지 않았습니다.
comm --check-order <(sort file1.txt) <(sort file2.txt)
~에서https://unix.stackexchange.com/a/186101/187419주문 오류는 반환되지 않습니다. 평소대로 실행되어 두 개의 출력 열이 제공됩니다.
이 솔루션나와 매우 가까운 문제에도 적용되지 않습니다.
파일에 일부 추가 문자가 있기 때문일 수도 있다고 생각하고 해결책도 언급했습니다.여기:set list
vim에서 하세요.
문제가 발생 하는지 테스트하기 위해 sort
제가 만든 테스트 파일(이전에 사용했던 파일)을 구체적으로 comm
숫자별로 정렬했는데 comm
여전히 작동했습니다.
찾을 수 있는 모든 솔루션을 시도했지만 성공하지 못했습니다. 다른 제안이 있나요?
답변1
당신 말이 거의 맞습니다. 각 줄에 추가 문자가 있으면 해당 줄이 정확히 일치하지 않게 됩니다. 이러한 추가 문자는 캐리지 리턴, 공백 또는 Windows 스타일 줄 종결자의 탭 형태이거나 기타 인쇄되지 않는 문자일 수 있습니다. 예를 들어, Python 스크립트는 숫자 중 일부 또는 전체에 선행 공백이 있도록 숫자를 오른쪽 정렬할 수 있습니다.
가장 신뢰할 수 있는 방법은 원치 않는 문자를 모두 필터링하는 것입니다. 데이터는 엄격하게 숫자이므로 다음과 같이 쉽게 수행할 수 있습니다 sed
.
sed 's/[^0-9]//g' < input > output
프로세스의 다양한 지점에 삽입할 수 있습니다. 이것은 그 중 하나일 뿐입니다:
comm <(sed 's/[^0-9]//g' file1.txt | sort) <(sed 's/[^0-9]//g' file2.txt | sort)