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.