Eu tenho dois arquivos _jeter3.txt e _jeter1.txt
Eu verifiquei que ambos 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 os join
dois arquivos, ele 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 : usar ' sort -f
' e join -i
(sem distinção entre maiúsculas e minúsculas) corrige o problema. Mas isso não explica meu problema inicial.
UPDATE : versões de classificação e associação:
> 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
.Respostas:
Eu recebi o mesmo erro no Ubuntu 11.04, com
sort
ejoin
ambos na versão (GNU coreutils) 8.5.Eles são claramente incompatíveis. De fato, o
sort
comando parece com erros: não há diferença com ou sem a opção-f
(--ignore-case
). Ao classificar,aaB
é sempre antesaBa
. Caracteres não alfanuméricos também parecem sempre ignorados (abc
antesab-x
)Join parece esperar o oposto ... Mas eu tenho uma solução
Na verdade, esta está ligada à sequência de agrupamento: usando
LANG=en_EN sort -k 1,1 <myfile> ...
, em seguida,LANG=en_EN join ...
elimina a mensagem.A internacionalização é a raiz do mal ... (ninguém a documenta claramente).
fonte
LANG=en_EN
, definitivamente funcionará? Funcionará para qualquer local, desde que ambos usem o mesmo local? Podemos dizer que a diferença entresort
ejoin
é que eles usam um código de idioma diferente por padrão?-k
opção é a resposta aqui ou é aLANG=en_EN
? Não está claro qual é a solução exata aqui.Você estava classificando com números? Eu descobri que o preenchimento zero da coluna na qual eu estava ingressando resolveu esse problema para mim.
fonte
Se você tiver certeza de que classificou corretamente seus arquivos de entrada e suas linhas podem ser emparelhadas, evite o erro acima executando
join --nocheck-order file1.txt file2.txt
fonte
sort
por padrão, usa a linha inteira como a chavejoin
usa apenas o campo especificado como a chave.Você deve corrigir essa incompatibilidade restringindo a classificação para usar apenas a chave na qual deseja ingressar.
A página do manual Join indica:
fonte
Isto irá resolver o seu problema. O problema, como apontado por @Michael, é a sequência de intercalação, que depende da sua configuração LOCALE.
fonte
Observe que se você vir esse erro e já tiver classificado em uma coluna específica e estiver batendo com a cabeça na parede, por exemplo, ordenar -k4,4, também poderá ser necessário definir o separador para o comando de ordenação
Aparentemente, o OP já fez isso com -t '', mas para um texto normal separado por tabulação eu recomendo
O comando de classificação 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 na coluna em que você está classificando).
Então, se você passou esses dados classificados para ingressar e você
Então isso acaba causando a mensagem de erro sobre a falta de classificação. Como observado acima, a junção pode não aceitar -t ''.
fonte
Para ingressar no argumento depois de -t é um caractere. Para classificação, 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ê deseja, e ignorar o caso resolve o problema por coincidência.
E eu concordo com Gilles, que dados de amostra seriam úteis.
fonte