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.