Localiza elementos comuns em uma determinada coluna a partir de dois arquivos e gera os valores das colunas de cada arquivo

3

Eu tenho dois arquivos com valores separados por tabulações que se parecem com isso:

arquivo1:

A    1
B    3
C    1
D    4

arquivo2:

E    1
B    3
C    2
A    9

Eu gostaria de encontrar linhas entre os arquivos 1 e 2, onde a string na coluna 1 é a mesma, então pegue os valores correspondentes. A saída desejada é um único arquivo que se parece com isto:

B    3    3
C    1    2
A    1    9

Isso pode ser feito com um one-liner do Unix?

    
por turtle 25.10.2012 / 11:41

3 respostas

10

GNU coreutils inclui o comando join que faz exatamente o que você quer se a classificação de linha no resultado for irrelevante:

join <(sort file1) <(sort file2)

A 1 9
B 3 3
C 1 2

Se você quiser as guias de volta, faça:

join <(sort file1) <(sort file2) | tr ' ' '\t'

A   1   9
B   3   3
C   1   2

Ou use a opção t para join .

( <() aka substituição de processo, requer ksh93 (onde o recurso foi originado em), bash ou zsh)

    
por 25.10.2012 / 11:55
2
ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2

Se você quiser guias na saída, faça

sort -k1 file2 | join -t "        " file1 -

onde você pode construir a aba dentro das aspas pressionando CTRL-V <tab> .

    
por 25.10.2012 / 11:51
1

Se você não quiser que a saída seja ordenada, mas tenha a mesma ordem que o arquivo2, o awk é uma boa ferramenta para usar:

awk '
    NR == FNR {val[$1]=$2; next} 
    $1 in val {print $1, val[$1], $2}
' file1 file2
    
por 25.10.2012 / 18:11

Tags