join: "File 2 non in ordine"


13

Ho due file _jeter3.txt e _jeter1.txt

Ho controllato che entrambi siano ordinati sulla 20a colonna usando sort -c

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

ma c'è un errore quando voglio joinentrambi i file, dice che il secondo file non è ordinato:

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

Non capisco perché.

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

AGGIORNAMENTO : l'utilizzo di ' sort -f' e join -i(senza distinzione tra maiuscole e minuscole) risolve il problema. Ma non spiega il mio problema iniziale.

AGGIORNAMENTO : versioni di 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.
(...)

Puoi darci l'output di "join --version" e "sort --version" solo per completezza? Non riesco a ottenere alcune versioni precedenti di GNU Join per darmi quel messaggio di errore in qualsiasi circostanza.
Bruce Ediger

3
Si prega di pubblicare alcuni dati di esempio che presentano il problema e l'output di locale.
Gilles 'SO- smetti di essere malvagio'

Risposte:


25

Ho avuto lo stesso errore con Ubuntu 11.04, con sorted joinentrambi nella versione (GNU coreutils) 8.5.

Sono chiaramente incompatibili. In effetti il sortcomando sembra infastidito: non c'è differenza con o senza l' opzione -f( --ignore-case). Durante l'ordinamento, aaBè sempre prima aBa. Anche i caratteri non alfanumerici sembrano sempre ignorati ( abcè prima ab-x)

Join sembra aspettarsi il contrario ... Ma ho una soluzione

In realtà, questo è collegato alla sequenza di confronto: l'utilizzo LANG=en_EN sort -k 1,1 <myfile> ...quindi LANG=en_EN join ...elimina il messaggio.

L'internazionalizzazione è la radice del male ... (nessuno lo documenta chiaramente).


Quindi, se entrambi usano LANG=en_EN, allora funzionerà sicuramente? Funzionerà con qualsiasi locale, purché entrambi utilizzino lo stesso locale? Possiamo dire che la differenza tra sorte joinè che usano una locale diversa per impostazione predefinita?
Aaron McDaid,

L' -kopzione è la risposta qui o è la LANG=en_EN? Non è chiaro quale sia la soluzione esatta qui.
Utente

5

Stavi ordinando con i numeri? Ho scoperto che il riempimento zero della colonna a cui mi stavo unendo ha risolto questo problema per me.

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

5

Se sei sicuro di aver correttamente ordinato i tuoi file di input e le loro linee possono essere accoppiate, puoi evitare l'errore sopra eseguendo join --nocheck-order file1.txt file2.txt


4

sort per impostazione predefinita utilizza l'intera riga come chiave

join utilizza solo il campo specificato come chiave.

È necessario correggere questa incompatibilità limitando l'ordinamento per utilizzare solo la chiave a cui si desidera partecipare.

La pagina man di Join afferma:

Importante: FILE1 e FILE2 devono essere ordinati nei campi di join. Ad esempio, utilizzare 'sort -k 1b, 1' se> 'join' non ha opzioni. Nota, i confronti rispettano le regole specificate da "LC_COLLATE". Se l'ingresso> non è ordinato e alcune linee non possono essere unite, verrà visualizzato un messaggio di avviso.


2
LOCALE=C sort ...
LOCALE=C join ...

Questo risolverà il tuo problema. Il problema, come sottolineato da @Michael, è la sequenza di confronto, che dipende dall'impostazione LOCALE.


2

Nota che se vedi questo errore e hai già ordinato su una colonna specifica e stai battendo la testa contro il muro, ad esempio sort -k4,4, potresti anche aver bisogno di impostare il separatore per il comando sort

Apparentemente OP lo ha già fatto con -t '' ma per un normale testo separato da tabulazione lo consiglio

sort -t $'\t' ...

Il comando di ordinamento può incorporare spazi come separatori per impostazione predefinita anche su qualcosa che assomiglia a un file separato da tabulazioni (specialmente se ci sono spazi all'interno della colonna su cui stai ordinando).

Quindi se hai passato quei dati ordinati per unirti e hai

join -t $'\t' ...

Quindi questo finisce causando il messaggio di errore che non è ordinato. Come notato sopra, tuttavia, join potrebbe non accettare -t ''.


1

Per unire l'argomento dopo -t è un personaggio. Per l'ordinamento è possibile fornire un separatore di ordinamento più lungo. Penso che potresti unire i file in un altro campo che desideri e ignorare il caso risolve il problema per coincidenza.

E sono d'accordo con Gilles, che i dati di esempio sarebbero utili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.