O comando Join dá uma saída incorreta?

1

Estou tentando juntar dois arquivos simples na versão 5.8 do Solaris, conforme abaixo:

~/temp/s: cat 1
work1 a 8058 51
work2 b 15336 51

~/temp/s: cat 2
8058 77-11:29:32 /apps/sas
15336 100-12:23:49 /local/hotfix

~/temp/s: join -1 3 -2 1 1 2
8058 work1 a 51 77-11:29:32 /apps/sas (The other line is missing from the output)

A saída contém apenas um registro em que deve ser dois. Eu realmente não tenho certeza de onde deu errado.

Existe alguma maneira de obtermos todos os registros na saída?

    
por Avinash 31.07.2013 / 14:59

2 respostas

1

Acho que isso pode ser um bug com join . Eu apenas tentei no Fedora 14 usando esta versão do join :

$ join --version
join (GNU coreutils) 8.5

Exemplo

$ join -1 3 -2 1 1 2
8058 work1 a 51 77-11:29:32 /apps/sas
15336 work2 b 51 100-12:23:49 /local/hotfix

Alternativa

Você pode usar awk para fazer isso:

$ awk 'NR==FNR{_[$3]=$3;next}$1 in _{print _[$1],$0}' 1 2
8058 8058 77-11:29:32 /apps/sas
15336 15336 100-12:23:49 /local/hotfix
    
por 31.07.2013 / 15:04
2

A chave de junção deve ser classificada de forma lexical.

Portanto, use um shell com suporte para substituição de processos (ksh93, zsh, bash) e:

join -1 3 -2 1 <(sort -k 3,3 1) <(sort -k 1,1 2)

Ou com um shell POSIX / Bourne:

sort -k 3,3 1 | {
  sort -k 1,1 2 | join -1 3 -2 1 /dev/fd/3 -; } 3<&0

Isso ajuda a entender como o join funciona. join lê os arquivos concorrentemente linha por linha e compara as chaves de junção, se eles forem iguais teremos uma correspondência e produziremos o resultado, se key1 < key2, continue lendo file1 até que key1 seja igual a key2 (ou maior, em cujo caso começamos a ler o arquivo2 e assim por diante).

Isso explica por que não funcionará se os arquivos não forem classificados por chave.

Note que este é o caso de todo join mas como uma extensão, GNU join não reclama enquanto as chaves coincidirem. Ele falharia como todos os outros, na primeira incompatibilidade se as linhas não forem ordenadas por chave.

    
por 31.07.2013 / 15:51

Tags