unirse: "El archivo 2 no está ordenado"

13

Tengo dos archivos _jeter3.txt y _jeter1.txt

He comprobado que ambos están ordenados en la columna 20 usando sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

pero hay un error cuando quiero que joinambos archivos digan que el segundo archivo no está ordenado:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

No entiendo por qué.

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

ACTUALIZACIÓN : el uso de ' sort -f' y join -i(sin distinción entre mayúsculas y minúsculas) soluciona el problema Pero no explica mi problema inicial.

ACTUALIZACIÓN : versiones de sort & join:

> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)

> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
Pierre
fuente
¿Puede darnos el resultado de "join --version" y "sort --version" solo por razones de integridad? No puedo obtener algunas versiones anteriores de gnu join para darme ese mensaje de error bajo ninguna circunstancia.
Bruce Ediger
3
Publique algunos datos de muestra que muestren el problema y el resultado de locale.
Gilles 'SO- deja de ser malvado'

Respuestas:

25

Obtuve el mismo error con Ubuntu 11.04, con sorty joinambos en la versión (GNU coreutils) 8.5.

Son claramente incompatibles. De hecho, el sortcomando parece tener errores: no hay diferencia con o sin la opción -f( --ignore-case) Al ordenar, aaBsiempre es antes aBa. Los caracteres no alfanuméricos también parecen ignorarse siempre ( abces antes ab-x)

Unirse parece esperar lo contrario ... Pero tengo una solución

De hecho, esto está relacionado con la secuencia de intercalación: utilizando LANG=en_EN sort -k 1,1 <myfile> ...entonces LANG=en_EN join ...elimina el mensaje.

La internacionalización es la raíz del mal ... (nadie lo documenta con claridad).

Miguel
fuente
Entonces, si ambos usan LANG=en_EN, entonces definitivamente funcionará. ¿Funcionará para cualquier configuración regional, siempre y cuando ambas utilicen la misma configuración regional? ¿Podemos decir que la diferencia entre sorty joines que usan una configuración regional diferente por defecto?
Aaron McDaid
¿Es la -kopción la respuesta aquí, o es la LANG=en_EN? No está claro cuál es la solución exacta aquí.
Usuario
5

¿Estabas ordenando con números? Descubrí que rellenar con ceros la columna a la que me estaba uniendo me resolvió este problema.

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt
Conor
fuente
5

Si está seguro de haber ordenado correctamente sus archivos de entrada y sus líneas se pueden emparejar, puede evitar el error anterior ejecutando join --nocheck-order file1.txt file2.txt

Yoav Weiss
fuente
4

sort por defecto usa toda la línea como clave

join usa solo el campo especificado como clave.

Debe corregir esta incompatibilidad restringiendo la clasificación para usar solo la clave a la que desea unirse.

La página de manual de Join dice:

Importante: FILE1 y FILE2 deben ordenarse en los campos de unión. Por ejemplo, use 'sort -k 1b, 1' si> 'unirse' no tiene opciones. Tenga en cuenta que las comparaciones respetan las reglas especificadas por 'LC_COLLATE'. Si la entrada> no está ordenada y algunas líneas no se pueden unir, se mostrará un mensaje de advertencia.

PeterVermont
fuente
2
LOCALE=C sort ...
LOCALE=C join ...

Esto resolverá tu problema. El problema, como lo señaló @Michael, es la secuencia de clasificación, que depende de su configuración LOCALE.

Jignesh Smart
fuente
2

Tenga en cuenta que si ve este error y ya ha ordenado en una columna específica y está golpeando su cabeza contra la pared, por ejemplo, sort -k4,4, entonces también puede necesitar configurar el separador para el comando de clasificación

Aparentemente, OP ya hizo esto con -t '', pero para un texto separado por tabulaciones normal, recomendaría

sort -t $'\t' ...

El comando de clasificación puede incorporar espacios como separadores de forma predeterminada, incluso en algo que parece un archivo separado por tabulaciones (especialmente si hay espacios dentro de la columna en la que está ordenando).

Entonces, si pasó esos datos ordenados para unirse, y tiene

join -t $'\t' ...

Entonces esto termina causando el mensaje de error acerca de que no está ordenado. Como se señaló anteriormente, unirse puede no aceptar -t '' sin embargo.

Colin D
fuente
1

Para unirse al argumento después de -t es un personaje. Para ordenar puede suministrar un separador de clasificación más largo. Creo que puede unir los archivos en un campo diferente que desee, e ignorar el caso resuelve el problema por coincidencia.

Y estoy de acuerdo con Gilles, que los datos de muestra serían útiles.

Paweł Brodacki
fuente