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 join
ambos 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.
(...)
locale
.Respuestas:
Obtuve el mismo error con Ubuntu 11.04, con
sort
yjoin
ambos en la versión (GNU coreutils) 8.5.Son claramente incompatibles. De hecho, el
sort
comando parece tener errores: no hay diferencia con o sin la opción-f
(--ignore-case
) Al ordenar,aaB
siempre es antesaBa
. Los caracteres no alfanuméricos también parecen ignorarse siempre (abc
es antesab-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> ...
entoncesLANG=en_EN join ...
elimina el mensaje.La internacionalización es la raíz del mal ... (nadie lo documenta con claridad).
fuente
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 entresort
yjoin
es que usan una configuración regional diferente por defecto?-k
opción la respuesta aquí, o es laLANG=en_EN
? No está claro cuál es la solución exacta aquí.¿Estabas ordenando con números? Descubrí que rellenar con ceros la columna a la que me estaba uniendo me resolvió este problema.
fuente
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
fuente
sort
por defecto usa toda la línea como clavejoin
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:
fuente
Esto resolverá tu problema. El problema, como lo señaló @Michael, es la secuencia de clasificación, que depende de su configuración LOCALE.
fuente
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
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
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.
fuente
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.
fuente