join: “Arquivo 2 não está em ordem de classificação”

10

Eu tenho dois arquivos _jeter3.txt e _jeter1.txt

Eu verifiquei se eles estão classificados na coluna 20 usando sort -c

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

mas há um erro quando eu quero join ambos os arquivos diz que o segundo arquivo não está classificado:

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

Eu não entendo o porquê.

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

UPDATE : o uso de ' sort -f ' e join -i (ambos insensitivos a maiúsculas e minúsculas) corrige o problema. Mas isso não explica meu problema inicial.

UPDATE : versões do tipo & junte-se:

> 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.
(...)
    
por Pierre 10.05.2011 / 18:07

7 respostas

21

Eu recebi o mesmo erro com o Ubuntu 11.04, com sort e join ambos na versão (GNU coreutils) 8.5.

Eles são claramente incompatíveis. Na verdade, o comando sort parece estar com defeito: não há diferença com ou sem a opção -f ( --ignore-case ). Ao classificar, aaB é sempre anterior a aBa . Caracteres não alfanuméricos também são sempre ignorados ( abc é antes de ab-x )

Junta parece esperar o contrário ... Mas eu tenho uma solução

Na verdade, isso está vinculado à sequência de intercalação: usar LANG=en_EN sort -k 1,1 <myfile> ... , em seguida, LANG=en_EN join ... elimina a mensagem.

Internacionalização é a raiz do mal ... (ninguém documenta isso claramente).

    
por 23.08.2011 / 14:57
5

Você estava classificando com números? Descobri que o preenchimento zero da coluna na qual eu estava participando resolveu esse problema para mim.

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

Se tiver certeza de que classificou corretamente seus arquivos de entrada e suas linhas podem ser emparelhados, você pode evitar o erro acima executando join --nocheck-order file1.txt file2.txt

    
por 14.03.2012 / 10:19
4

sort por padrão usa a linha inteira como a chave

join usa apenas o campo especificado como chave.

Você deve corrigir essa incompatibilidade restringindo a classificação para usar apenas a chave na qual deseja participar.

Os estados da página man do Join:

Important: FILE1 and FILE2 must be sorted on the join fields. E.g., use 'sort -k 1b,1' if >'join' has no options. Note, comparisons honor the rules specified by 'LC_COLLATE'. If the >input is not sorted and some lines cannot be joined, a warning message will be given.

    
por 08.11.2013 / 22:33
1

Para juntar o argumento depois de -t é um caractere. Para classificar, você pode fornecer um separador de classificação mais longo. Eu acho que você pode estar juntando os arquivos em um campo diferente que você quer, e ignorar o caso resolve o problema por coincidência.

E eu concordo com Gilles, que os dados da amostra seriam úteis.

    
por 12.05.2011 / 11:56
1
LOCALE=C sort ...
LOCALE=C join ...

Isso resolverá seu problema. A questão, como apontado por @Michael, é a sequência de intercalação, que depende da sua configuração LOCALE.

    
por 23.10.2016 / 19:04
1

Se você vir esse erro e já tiver classificado em uma coluna específica e estiver batendo com a cabeça contra a parede, tipo -k4,4 então você também pode precisar definir o separador para o comando sort

Aparentemente, o OP já fez isso com -t '', mas para um texto normal separado por guias, recomendo

sort -t $'\t' ...

O comando sort pode incorporar espaços como separadores por padrão, mesmo em algo que se parece com um arquivo separado por tabulação (especialmente se houver espaços dentro da coluna na qual você está classificando).

Então, se você passar os dados classificados para participar, terá

join -t $'\t' ...

Em seguida, isso acaba causando a mensagem de erro sobre a não classificação. Como mencionado acima, join não pode aceitar -t '' embora.

    
por 25.05.2017 / 19:40

Tags