통신 : 파일이 정렬 된 순서가 아닙니다


9

나는 comm두 개의 정렬 된 파일을 비교 하는 데 사용 했습니다. 이 파일의 각 줄은 양의 정수입니다. 그러나 결과는

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

이 두 파일을 정렬하더라도 어떻게 오류가 발생합니까?


필자의 경우 작은 소문자를 고려하는 notepad ++를 사용하여 파일을 정렬 (사전 오름차순)하고 대문자는 소문자를 구분합니다. 'Z'뒤에 오름차순으로 a가 나타납니다. 이것은 정렬 유틸리티 (bash)가 정렬하는 방법과 다릅니다. 이것을 확인하기 위해 모든 줄을 대문자로 변환 한 다음 np ++로 정렬하면 통신이 더 이상 불평하지 않았습니다.
Sahil Singh

답변:


10

commsort숫자 정렬 ( sort -n)이 아닌 사전 정렬 (일반 )이 필요합니다 . 예를 들어 다음 순서를 원합니다.

1
2000
300

다음 순서는 아닙니다.

1
300
2000

이 문제를 해결하면 문제가 해결됩니다. 난해한 경우에 comm의 로케일이 다를 수 있습니다 sort로케일, 당신은 실행할 수 있습니다 sortcomm함께 LC_COLLATE=C자신의 환경에서 네이티브 바이트 순서를 사용합니다.


숫자 정렬하는 방법?
wenzi

4
@wenzisort -n
Gilles 'SO- 악마 중지

" Lexographic 주문은 일련의 숫자는 곳"입니다 확대하지 당신이 당신의 대답에 거꾸로있어 seeries- 주문한에서 : mathworld.wolfram.com/LexicographicOrder.html . 사용 비교 내 아래의 대답은 테스트 결과를 참조하십시오 sort 와를 , 그리고 없이-n 스위치 만 보여줍니다 으로-n 올바른 달성 할 수있는 스위치 증가 는 인정하기 위해 자신의 대답이 필요합니다.
F1Linux

@ F1Linux 무엇? comm말 그대로 LC_COLLATEd 순서 가 필요합니다 . 대답의 오류가 테스트 세트 외부의 예에 대해서는 순수한 외형이 아니라고 말하는 것으로 충분합니다 ... 아무도 양의 숫자 정렬을 요구하지 않았습니다.
크리스 다운

@ChrisDown 내가 응답 한 답변-방금 편집 한 것이 아니라 지금 " LC_COLLATE "에 대해서만 언급했습니다 . " comm은 숫자 정렬이 아닌 문자 사전 정렬을 원합니다.이 문제를 해결하면 문제가 해결됩니다. " "LC_COLLATE"에 대해서는 "_Lexographic"정렬과 매우 다른 짐승이 있습니다. 실제로, 당신은 초기 답변이 단지 한 줄로 너무나 희박하여 예를 들지 않았습니다. 언급 한대로 "LC_COLLATE"가 여기에서 확실히 작동하기 때문에 업데이트 된 답변을지지합니다.
F1Linux

0

업데이트 된 답변 :

문제:

텍스트가 아닌 파일에서 양의 정수 를 비교할 때 OP가 " 파일이 정렬 된 순서가 아닙니다 "라는 오류를 수신하고 있습니다. 그래서 우리는 10 진수가 아닌 숫자를 다루고 있습니다.comm

짧은 답변:

에 제공된 결과를 정렬하는 데 사용 -nsort명령에 스위치를 사용하는 경우에 따라 comm반환되는 결과의 순서는 comm매우 다를 수 있습니다.

Lexographic : -n정렬과 함께 스위치를 사용 하면 "정수"가 일련의 숫자로 증가합니다. `s 스위치를 사용하여 " 오류 "를 억제 할 수 있습니다comm--nocheck-order

바이트 순서는 : 없다 NO 의 사용 -n switch과 함께 sort. 명령이 실행되는 호스트에서 설정 LC_COLLATE방법에 따라 달라질 수있는 순서를 결정합니다 locale. comm기본적으로 예상되는 입력 입니다. 약간 더 자세한 내용 LC_COLLATE은 여기를 참조 하십시오 : Reference1Reference2

오류가 문제입니까? 그것은 당신이 달성하려는 것에 달려 있습니다. 당신이 예를 아래에서 볼 수 있듯이,comm파일을 비교 한 후 같은 결과를 반환 과 함께 또는 없이 sort `의-n자신의 순서가이 있는지 여부에 따라 위의 방법으로 다양이기는하지만, 스위치를-n switch함께 사용되는sort명령. 나 자신은 시리즈에서 증가하는 "렉소 그래픽"정렬 된 결과-숫자를 선호한다.

그러나 결과를 " 사전 "순서로 원하지 않으면 비교 를 위해 제공된 데이터를 정렬 할 때 스위치를 사용 하지 마십시오 .-ncomm

테스트 :

우리는 스위치의 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

결과 : 정확하지만 정렬되지 않은 순서로 반환

WITH -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

결과 : 수정-이 숫자는 각 파일마다 다릅니다.

WITH -n 스위치 :

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

결과 : 스위치가 comm없는 것과 동일한 결과가 정확 -n하지만 파일 자체에서 정렬되지 않은 양의 정수 순서에 대한 오류를 반환합니다.

LEXOGRAPHIC 결과에 대한 솔루션 :

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에게 감사드립니다. 항상 내 작업을 검토하게되어 기쁘다 : 우리가 더 나아질 수있는 유일한 방법은 우리가 동료들에 의해 끊임없이 밀려 나고 도전을받는 것입니다.


가장 많이 투표 된 답변은 "comm은 사전 식 정렬을 원합니다"라고 언급하지만 숫자로 정렬하는 것처럼 보입니다. 어떤 경우에는 떨어질 것 같습니다.
dhag

1000, 200, 30, 4와 같이 숫자와 사전
식이

@Kusalananda 방금 업데이트 된 답변에 매우 친절하고 유용한 피드백을 포함 시켰습니다. 귀하의 의견에 가장 큰 의무가 있습니다!
F1Linux

@dhag가 방금 답변을 업데이트하여 Kusalanada의 의견을 반영했습니다. 내 답변을 검토하기 위해 시간과 노력을들이는 여러분에게 가장 큰 의무입니다 –
F1Linux

1
@JeffSchaller 내가 처음에 대답 한 대답은 Chris의 새로 수정 된 답변에서와 같이 "LC_COLLATE"가 아니라 "Lexographic"정렬에 대해 언급했습니다. 나는 Chris에게 정확하다고 대답했고 그의 업데이트 된 답변을 찬성했습니다. "Lexographic"과 "LC_COLLATE"는 다른 짐승입니다. 감사합니다 Jeff-
F1Linux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.