Solía comm
comparar 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?
sort
comm
numeric-data
Wenzi
fuente
fuente
Respuestas:
comm
requiere ordenación lexicográfica (simplesort
), no ordenación numérica (sort -n
). Por ejemplo, quiere el siguiente orden:No es el siguiente orden:
Corrija esto y el problema debería desaparecer. Para los casos más esotéricos, donde
comm
's local puede ser diferente de lasort
configuración regional, es posible que desee ejecutarsort
ycomm
conLC_COLLATE=C
en su entorno para utilizar el orden de bytes nativo.fuente
sort -n
sort
con y sin el-n
interruptor y demuestra solo con el-n
interruptor que puede lograr el orden creciente correcto que reconoce que se requiere en su propia respuesta.comm
literalmente requiereLC_COLLATE
d 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.RESPUESTA ACTUALIZADA:
PROBLEMA:
El OP está recibiendo un error sobre "el archivo no está en orden " cuando se usa
comm
para comparar enteros positivos en los archivos, no texto. Entonces estamos tratando con números no decimales.Respuesta corta:
Dependiendo del uso del
-n
interruptor con elsort
comando utilizado para ordenar los resultados suministradoscomm
, el orden de los resultados devueltos porcomm
puede ser muy diferente:Lexográfico : el uso del
-n
interruptor con clasificación dará como resultado que se ordenen los "enteros positivos" en una serie de números crecientes. El " error " se puede suprimir utilizandocomm
el interruptor `s--nocheck-order
Orden de bytes : NO hay uso de
-n switch
consort
.LC_COLLATE
determina el orden que incluso puede variar según lalocale
configuración del host en el que se ejecuta el comando. Esta es la entrada que secomm
espera por defecto.LC_COLLATE
Puede 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,
comm
devuelve los mismos resultados después de comparar los archivos con o sinsort
el-n
interruptor`s, aunque su orden variará de la manera anterior dependiendo de si-n switch
se usa con elsort
comando. 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
-n
interruptor al ordenar los datos suministradoscomm
para la comparación.PRUEBAS:
Compararemos los resultados del
comm
comando con y sin el-n
interruptor. He aumentado la complejidad de mi conjunto de datos de prueba de muestras por solicitud de Kusalananda:Datos de prueba :
file1.txt :
file2.txt :
intersección :
Lista solo los números comunes a AMBOS archivos
Sin
-n
interruptor:Resultados : correcto, pero devuelto en un orden no ordenado
Con
-n
interruptor: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
comm
sin el-n
interruptor, pero en una lista ordenada.Diferencia :
Lista solo números únicos para cada archivo:
Sin
-n
interruptor:Resultados : Correcto: estos números son exclusivos de cada archivo respectivo.
Con
-n
interruptor:Resultados : Correctos, los mismos resultados que
comm
sin el-n
modificador, 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
comm
el--nocheck-order
interruptor `s para suprimir el mensaje de error. Como sabemos que los números no están ordenados en cada archivo pero los resultados devueltoscomm -n
son correctos, el error puede ignorarse de forma segura al suprimirlo:intersección :
Diferencia :
CONCLUSIÓN:
El error "el archivo no está en orden de clasificación " cuando se devuelve la clasificación de enteros positivos alimentados
comm
no significa que los resultados devueltos con el-n
interruptor concomm
estén incorrectos. De hecho, el usocomm -n
devuelve 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.
fuente