comm: el archivo no está ordenado


9

Solía commcomparar dos archivos ordenados. Cada línea en estos archivos son números enteros positivos. Pero los resultados muestran

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

¿Cómo es que el error incluso si estos dos archivos están ordenados?


En mi caso, había ordenado (ascendente lexicográfico) los archivos usando notepad ++, que considera letras minúsculas y mayúsculas separadas, por ejemplo. a aparecerá después de 'Z' en orden ascendente. Esto es diferente de cómo se clasifica la utilidad sort (bash). Para verificar esto, convertí todas las líneas a mayúsculas y luego las ordené en np ++, ya no me quejé.
Sahil Singh

Respuestas:


10

commrequiere ordenación lexicográfica (simple sort), no ordenación numérica ( sort -n). Por ejemplo, quiere el siguiente orden:

1
2000
300

No es el siguiente orden:

1
300
2000

Corrija esto y el problema debería desaparecer. Para los casos más esotéricos, donde comm's local puede ser diferente de la sortconfiguración regional, es posible que desee ejecutar sorty commcon LC_COLLATE=Cen su entorno para utilizar el orden de bytes nativo.


¿Cómo hacer que haga una ordenación numérica?
wenzi


" Orden Lexographic " es donde una serie de números AUMENTAR de forma ordenada seeries- lo tienes hacia atrás en su respuesta: mathworld.wolfram.com/LexicographicOrder.html . Consulte los resultados de la prueba de mi respuesta a continuación que compara el uso de sort con y sin el -ninterruptor y demuestra solo con el -ninterruptor que puede lograr el orden creciente correcto que reconoce que se requiere en su propia respuesta.
F1Linux

@ F1Linux ¿Qué? commliteralmente requiere LC_COLLATEd ordenar. Baste decir que los errores en su respuesta no son puramente cosméticos para ejemplos fuera de su conjunto de pruebas ... nadie solicitó una clasificación numérica positiva.
Chris Down

@ChrisDown Su respuesta a la que respondí, no a la que veo que acaba de editar y que AHORA menciona " LC_COLLATE " fue: "la comunicación quiere una clasificación literallexicográfica, no una clasificación numérica. Corrija esto y el problema debería desaparecer " . Ahora donde había algo sobre "LC_COLLATE", que es una bestia muy diferente del tipo "_Lexographic". De hecho, su respuesta inicial fue tan escasa en una sola línea sin NINGÚN EJEMPLO que fue lo que me llevó a revisar la pregunta con mi propia respuesta. Estoy votando su respuesta actualizada porque "LC_COLLATE" definitivamente está operativo aquí, como notó.
F1Linux

0

RESPUESTA ACTUALIZADA:

PROBLEMA:

El OP está recibiendo un error sobre "el archivo no está en orden " cuando se usa commpara comparar enteros positivos en los archivos, no texto. Entonces estamos tratando con números no decimales.

Respuesta corta:

Dependiendo del uso del -ninterruptor con el sortcomando utilizado para ordenar los resultados suministrados comm, el orden de los resultados devueltos por commpuede ser muy diferente:

Lexográfico : el uso del -ninterruptor con clasificación dará como resultado que se ordenen los "enteros positivos" en una serie de números crecientes. El " error " se puede suprimir utilizando commel interruptor `s--nocheck-order

Orden de bytes : NO hay uso de -n switchcon sort. LC_COLLATEdetermina el orden que incluso puede variar según la localeconfiguración del host en el que se ejecuta el comando. Esta es la entrada que se commespera por defecto. LC_COLLATEPuede encontrar un poco más sobre esto: Referencia1 y Referencia2

¿Es el error un problema? Eso depende de lo que intentes lograr. Como verá en los ejemplos a continuación,commdevuelve los mismos resultados después de comparar los archivos con o sin sort el-ninterruptor`s, aunque su orden variará de la manera anterior dependiendo de si-n switchse usa con elsortcomando. Yo prefiero los resultados ordenados "lexográficos", números que aumentan en una serie.

Sin embargo, si no desea los resultados en orden " lexográfico ", NO use el -ninterruptor al ordenar los datos suministrados commpara la comparación.

PRUEBAS:

Compararemos los resultados del commcomando con y sin el -ninterruptor. He aumentado la complejidad de mi conjunto de datos de prueba de muestras por solicitud de Kusalananda:

Datos de prueba :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

intersección :

Lista solo los números comunes a AMBOS archivos

Sin -ninterruptor:

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

2200
33000
40
6

Resultados : correcto, pero devuelto en un orden no ordenado

Con -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 : Correcto, pero devuelto en un orden ordenado LEXOGRÁFICO . La operación se completó correctamente y devolvió los mismos resultados que si se usara commsin el -ninterruptor, pero en una lista ordenada.

Diferencia :

Lista solo números únicos para cada archivo:

Sin -ninterruptor:

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

110000
         440000

Resultados : Correcto: estos números son exclusivos de cada archivo respectivo.

Con -n interruptor:

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

110000
comm: file 1 is not in sorted order
         440000

Resultados : Correctos, los mismos resultados que commsin el -nmodificador, pero devuelve el error sobre el orden de los enteros positivos que no se ordenan en los propios archivos.

SOLUCIÓN para RESULTADOS LEXOGRÁFICOS:

Use commel --nocheck-orderinterruptor `s para suprimir el mensaje de error. Como sabemos que los números no están ordenados en cada archivo pero los resultados devueltos comm -nson correctos, el error puede ignorarse de forma segura al suprimirlo:

intersección :

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

6
40
2200
33000

Diferencia :

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

110000
         440000

CONCLUSIÓN:

El error "el archivo no está en orden de clasificación " cuando se devuelve la clasificación de enteros positivos alimentados commno significa que los resultados devueltos con el -ninterruptor con commestén incorrectos. De hecho, el uso comm -ndevuelve un orden correcto en un orden ordenado.

Gracias a @dhag, @kusalananda @ChrisDown por plantear los problemas que requerían una mayor expansión. Siempre feliz de que mi trabajo sea revisado: la única forma en que podemos mejorar es si nuestros pares nos presionan y desafían constantemente.


La respuesta más votada menciona que "la comunicación quiere una clasificación lexicográfica", aunque pareces ordenar numéricamente. Parece que caerá en algunos casos.
Dhag

Pruebe nuevamente con números que se ordenan numérica y lexicográficamente de manera diferente, como 1000, 200, 30, 4.
Kusalananda

@Kusalananda Acabo de incorporar sus comentarios muy amables y útiles en mi respuesta actualizada. ¡Muy agradecido por sus comentarios!
F1Linux

@dhag acaba de actualizar mi respuesta para incorporar la suya y los comentarios de Kusalanada. Muy agradecidos por ustedes, amigos, tomándose el tiempo y el esfuerzo para revisar mi respuesta.
F1Linux

1
@JeffSchaller La respuesta a la que respondí inicialmente mencionaba el tipo "Lexográfico", no "LC_COLLATE" como en la respuesta recientemente enmendada de Chris. Le respondí a Chris que es correcto y voté por su respuesta actualizada. "Lexographic" y "LC_COLLATE" son diferentes bestias. Gracias Jeff-
F1Linux
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.