Mesclando o conteúdo de dois arquivos com a comparação do conteúdo da coluna

3

Eu tenho um problema ao tentar mesclar o conteúdo de dois arquivos:

arquivo 1:

873 1.1.1.1 
1033 99.99.99.10
1108 78.2.204.174
1257 78.2.8.181

arquivo 2:

test1 78.2.8.181 p6
test2 99.99.99.10 p9
test7 1.1.1.1 p10
test8 78.2.204.174 p4

Eu quero mesclar os dois arquivos em um arquivo como este, levando em consideração que as colunas compartilhadas são o segundo, & deve ser comparado para se encaixar na linha em questão:

873  1.1.1.1      test7 p10
1033 99.99.99.10  test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181   test1 p6

Eu tentei várias coisas usando awk , mas sem sucesso.

    
por hatim 07.12.2012 / 15:10

3 respostas

3

Você pode usar join para isso.

Primeiro, temos que classificar os dois arquivos usando a segunda coluna como chave:

$ sort -t' ' -k 2,2 a > as
$ sort -t' ' -k 2,2 b > bs

Como resultado:

$ cat as
873 1.1.1.1
1108 78.2.204.174
1257 78.2.8.181
1033 99.99.99.10
$ cat bs
test7 1.1.1.1 p10
test8 78.2.204.174 p4
test1 78.2.8.181 p6
test2 99.99.99.10 p9

Em seguida, a junção real:

$ join -t' ' -j2 as bs
1.1.1.1 873 test7 p10
78.2.204.174 1108 test8 p4
78.2.8.181 1257 test1 p6
99.99.99.10 1033 test2 p9
    
por 07.12.2012 / 15:41
3
join -j2 <(sort -k2 file1) <(sort -k2 file2) -o 1.1,1.2,2.1,2.3 | column -t

saídas

873   1.1.1.1       test7  p10
1108  78.2.204.174  test8  p4
1257  78.2.8.181    test1  p6
1033  99.99.99.10   test2  p9
    
por 07.12.2012 / 18:28
2

Uma maneira de usar o awk:

$ awk 'NR==FNR{a[$2]=$1 FS $3;next}{print $0 FS a[$2] }' file2 file1
873 1.1.1.1  test7 p10
1033 99.99.99.10 test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181 test1 p6

O arquivo f2 é carregado em uma matriz onde o segundo campo é o índice e o valor da matriz é a combinação dos 3º e 4º campos do arquivo2. Quando arquivo1 é processado, a linha inteira junto com o valor armazenado na matriz é impressa.

    
por 07.12.2012 / 15:21