나는 comm
두 개의 정렬 된 파일을 비교 하는 데 사용 했습니다. 이 파일의 각 줄은 양의 정수입니다. 그러나 결과는
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
이 두 파일을 정렬하더라도 어떻게 오류가 발생합니까?
나는 comm
두 개의 정렬 된 파일을 비교 하는 데 사용 했습니다. 이 파일의 각 줄은 양의 정수입니다. 그러나 결과는
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
이 두 파일을 정렬하더라도 어떻게 오류가 발생합니까?
답변:
comm
sort
숫자 정렬 ( sort -n
)이 아닌 사전 정렬 (일반 )이 필요합니다 . 예를 들어 다음 순서를 원합니다.
1
2000
300
다음 순서는 아닙니다.
1
300
2000
이 문제를 해결하면 문제가 해결됩니다. 난해한 경우에 comm
의 로케일이 다를 수 있습니다 sort
로케일, 당신은 실행할 수 있습니다 sort
와 comm
함께 LC_COLLATE=C
자신의 환경에서 네이티브 바이트 순서를 사용합니다.
sort -n
sort
와를 , 그리고 없이-n
스위치 만 보여줍니다 으로-n
올바른 달성 할 수있는 스위치 증가 는 인정하기 위해 자신의 대답이 필요합니다.
comm
말 그대로 LC_COLLATE
d 순서 가 필요합니다 . 대답의 오류가 테스트 세트 외부의 예에 대해서는 순수한 외형이 아니라고 말하는 것으로 충분합니다 ... 아무도 양의 숫자 정렬을 요구하지 않았습니다.
텍스트가 아닌 파일에서 양의 정수 를 비교할 때 OP가 " 파일이 정렬 된 순서가 아닙니다 "라는 오류를 수신하고 있습니다. 그래서 우리는 10 진수가 아닌 숫자를 다루고 있습니다.comm
에 제공된 결과를 정렬하는 데 사용 -n
된 sort
명령에 스위치를 사용하는 경우에 따라 comm
반환되는 결과의 순서는 comm
매우 다를 수 있습니다.
Lexographic : -n
정렬과 함께 스위치를 사용 하면 "정수"가 일련의 숫자로 증가합니다. `s 스위치를 사용하여 " 오류 "를 억제 할 수 있습니다comm
--nocheck-order
바이트 순서는 : 없다 NO 의 사용 -n switch
과 함께 sort
. 명령이 실행되는 호스트에서 설정 LC_COLLATE
방법에 따라 달라질 수있는 순서를 결정합니다 locale
. comm
기본적으로 예상되는 입력 입니다. 약간 더 자세한 내용 LC_COLLATE
은 여기를 참조 하십시오 : Reference1 및 Reference2
오류가 문제입니까?
그것은 당신이 달성하려는 것에 달려 있습니다. 당신이 예를 아래에서 볼 수 있듯이,comm
파일을 비교 한 후 같은 결과를 반환 과 함께 또는 없이 sort
`의-n
자신의 순서가이 있는지 여부에 따라 위의 방법으로 다양이기는하지만, 스위치를-n switch
함께 사용되는sort
명령. 나 자신은 시리즈에서 증가하는 "렉소 그래픽"정렬 된 결과-숫자를 선호한다.
그러나 결과를 " 사전 "순서로 원하지 않으면 비교 를 위해 제공된 데이터를 정렬 할 때 스위치를 사용 하지 마십시오 .-n
comm
우리는 스위치의 comm
유무에 관계없이 명령 의 결과를 비교할 것 -n
입니다. Kusalananda의 요청에 따라 시편 테스트 데이터 세트의 복잡성을 증가 시켰습니다.
file1.txt :
40
110000
2200
6
33000
file2.txt :
2200
40
33000
6
440000
두 파일 모두에 공통적 인 숫자 만 나열
-n
스위치 없이 :comm -12 <(sort file1.txt) <(sort file2.txt)
2200
33000
40
6
결과 : 정확하지만 정렬되지 않은 순서로 반환
-n
스위치 :comm -12 <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm: file 1 is not in sorted order
결과 : 맞지만 LEXOGRAPHIC 정렬 순서 로 리턴됩니다 . 작업이 성공적으로 완료되었으며 스위치 comm
없이 사용하는 것과 동일한 결과 -n
가 정렬 된 목록 으로 반환되었습니다 .
각 파일에 고유 한 숫자 만 나열하십시오.
-n
스위치 없이 :comm -3 <(sort file1.txt) <(sort file2.txt)
110000
440000
결과 : 수정-이 숫자는 각 파일마다 다릅니다.
-n
스위치 :comm -3 <(sort -n file1.txt) <(sort -n file2.txt)
110000
comm: file 1 is not in sorted order
440000
결과 : 스위치가 comm
없는 것과 동일한 결과가 정확 -n
하지만 파일 자체에서 정렬되지 않은 양의 정수 순서에 대한 오류를 반환합니다.
comm
`s --nocheck-order
스위치를 사용 하여 오류 메시지를 억제하십시오. 각 파일에서 숫자가 정렬되지 않았지만로 반환 된 결과 comm -n
가 정확하다는 것을 알고 있으므로 오류를 억제하면 오류를 무시해도됩니다.
comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
110000
440000
반환 된 양의 정수를 반환 할 때 " 파일이 정렬 된 순서가 아닙니다 "라는 오류 comm
는 -n
스위치를 사용하여 반환 된 결과 comm
가 잘못되었음을 의미하지 않습니다 . 실제로를 사용 comm -n
하면 정렬 된 순서대로 깔끔한 정답 을 반환합니다!
추가 확장이 필요한 문제를 제기 해 주신 @kusalananda @ChrisDown @dhag에게 감사드립니다. 항상 내 작업을 검토하게되어 기쁘다 : 우리가 더 나아질 수있는 유일한 방법은 우리가 동료들에 의해 끊임없이 밀려 나고 도전을받는 것입니다.