comm: o arquivo não está na ordem classificada

9

Eu costumava commcomparar dois arquivos classificados. Cada linha desses arquivos é um número inteiro positivo. Mas os resultados mostram

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

Como ocorre o erro, mesmo que esses dois arquivos sejam classificados?

wenzi
fonte
No meu caso, classifiquei (lexicograficamente ascendente) os arquivos usando o bloco de notas ++, que considera letras maiúsculas e minúsculas, por exemplo. a aparecerá após 'Z' em ordem crescente. Isso é diferente de como o utilitário de classificação (bash) classifica. Para verificar isso, converti todas as linhas para maiúsculas e, em seguida, classifiquei em np ++, o comm não reclamou mais.
Sahil Singh

Respostas:

10

commrequer classificação lexicográfica (simples sort), não classificação numérica ( sort -n). Por exemplo, ele deseja a seguinte ordem:

1
2000
300

Não é a seguinte ordem:

1
300
2000

Corrija isso e o problema deve desaparecer. Para casos mais esotéricos, onde comm's locale pode ser diferente do sortlocale, você pode querer executar sorte commcom LC_COLLATE=Cem seu ambiente de usar ordenação byte nativa.

Chris Down
fonte
como fazê-lo fazer classificação numérica?
wenzi
4
@wenzisort -n
Gilles 'SO- stop
" Pedido Lexográfico " é o local em que uma série de números AUMENTA em uma série ordenada - você o retrocede na sua resposta: mathworld.wolfram.com/LexicographicOrder.html . Consulte os resultados dos testes da minha resposta abaixo, que comparam o uso de sort com e sem o -ncomutador e demonstram apenas com o -ncomutador você pode obter a ordem crescente correta que você reconhece que é necessária em sua própria resposta.
F1Linux 18/03
@ F1Linux O que? commrequer literalmente LC_COLLATEd ordenação. Basta dizer que os erros na sua resposta não são puramente cosméticos para exemplos fora do seu conjunto de testes ... ninguém pediu uma classificação numérica positiva.
Chris Down
@ ChrisDown Sua resposta à qual eu respondi - e não a que eu acabei de editar e que o NOW menciona agora " LC_COLLATE " era: " comm quer uma classificação literallexicográfica, não numérica. Corrija isso e o problema deve desaparecer " . Agora, onde havia algo sobre "LC_COLLATE", que é um animal muito diferente do tipo "_Lexographic". De fato, sua resposta inicial foi tão escassa em apenas uma linha com SEM EXEMPLOS que foi o que me levou a revisitar a pergunta com minha própria resposta. Estou votando sua resposta atualizada porque "LC_COLLATE" está definitivamente operacional aqui, como você observou.
F1Linux 18/03
0

RESPOSTA ATUALIZADA:

PROBLEMA:

O OP está recebendo um erro sobre "o arquivo não está na ordem classificada " ao ser usado commpara comparar números inteiros positivos nos arquivos, não no texto. Então, estamos lidando com números não decimais.

Resposta curta:

Dependendo do uso do -ncomutador com o sortcomando usado para classificar os resultados fornecidos comm, a ordem dos resultados retornados por commpode ser muito diferente:

Lexográfico : O uso do -ncomutador com classificação resultará na ordenação de "Inteiros positivos" em uma série de números crescentes. O " erro " pode ser suprimido usando commo interruptor `s--nocheck-order

Ordem de bytes : NÃO há uso do -n switchcom sort. LC_COLLATEdetermina a ordem que pode até variar de acordo com a localeconfiguração no host em que o comando é executado. Essa é a entrada commesperada por padrão. Um pouco mais sobre isso LC_COLLATEpode ser encontrado aqui: Referência1 e Referência2

O erro é um problema? Isso depende do que você está tentando alcançar. Como você verá nos exemplos abaixo,commretorna os mesmos resultados depois de comparar os arquivos com ou sem sort a-nopção`s, embora sua ordem varie da maneira acima, dependendo se-n switché usada com osortcomando. Eu mesmo prefiro resultados ordenados "lexográficos" - números que aumentam em uma série.

No entanto, se você não deseja os resultados na ordem " lexográfica ", NÃO use a -nopção ao classificar os dados fornecidos commpara comparação.

TESTE:

Compararemos os resultados do commcomando com e sem o -ncomutador. Aumentei a complexidade do meu conjunto de dados de teste de amostra por solicitação de Kusalananda:

Dados de teste :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Interseção :

Listar apenas números comuns a ambos os arquivos

Sem -ninterruptor:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Resultados : correto, mas retornado em um pedido não classificado

Com -n interruptor:

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

6
40
2200
33000
comm: file 1 is not in sorted order

Resultados : correto, mas retornado em uma ordem classificada LEXOGRAPHIC . A operação foi concluída com êxito e retornou os mesmos resultados que o uso commsem a -nopção, mas em uma lista classificada.

Diferença :

Liste apenas números exclusivos para cada arquivo:

Sem -ninterruptor:

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

110000
         440000

Resultados : Correto - esses números são realmente exclusivos para cada arquivo respectivo.

Com -n interruptor:

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

110000
comm: file 1 is not in sorted order
         440000

Resultados : Corretos, mesmos resultados que commsem a -nopção, mas retornam o erro sobre a ordem dos números inteiros positivos que não foram classificados nos próprios arquivos.

SOLUÇÃO PARA RESULTADOS LEXOGRÁFICOS:

Use comma --nocheck-orderopção `s para suprimir a mensagem de erro. Como sabemos que os números não são classificados em cada arquivo, mas os resultados retornados comm -nestão corretos, o erro pode ser ignorado com segurança, suprimindo-o:

Interseção :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Diferença :

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

110000
         440000

CONCLUSÃO:

O erro "o arquivo não está na ordem de classificação " quando a classificação retornada de números inteiros positivos alimentados commnão significa que os resultados retornados usando a -nopção com commestão incorretos. De fato, usar comm -nretorna um arrumado correto em uma ordem classificada!

Graças a @dhag, @kusalananda @ChrisDown por levantar as questões que exigiam maior expansão. Sempre feliz em revisar meu trabalho: a única maneira de melhorar é se somos constantemente pressionados e desafiados por nossos colegas.

F1Linux
fonte
A resposta mais votada menciona que "comm quer classificação lexicográfica", mas você parece ordenar numericamente. Parece que ele cairá em alguns casos.
dhag 18/03
Teste novamente com números que diferem numericamente e lexicograficamente de maneira diferente, como 1000, 200, 30, 4.
Kusalananda
@Kusalananda Acabei de incorporar seu feedback muito gentil e útil na minha resposta atualizada. Mais obrigado pelo seu feedback!
F1Linux 18/03
@dhag acabou de atualizar minha resposta para incorporar a sua opinião sobre a Kusalanada. Muito obrigado por vocês,
dedicarem
1
@JeffSchaller A resposta que respondi inicialmente mencionou o tipo "Lexographic", não "LC_COLLATE", como na resposta recém-alterada de Chris. Eu respondi a Chris que está correto e votei positivamente em sua resposta atualizada. "Lexographic" e "LC_COLLATE" são bestas diferentes. Obrigado Jeff-
F1Linux 18/03