string de awk corresponde de 2 colunas

3

Eu tenho um arquivo (arquivo 1) que lê algo assim:

2  test1
3  test2 
2  test3 
1  test1 
4  test2

E há um arquivo mestre (arquivo2):

2    test1
3  test1
4         test1
2  test2
3 test2
4   test2
5 test2 
...

Eu quero imprimir todas as linhas do arquivo2 quando houver correspondência entre a coluna 1 e a coluna 2 do arquivo 1. Eu quero manter a formatação aleatória do arquivo 2 preservada. Qual seria a melhor maneira de fazer isso?

    
por Ash 23.03.2017 / 15:41

3 respostas

7

tente

awk 'NR==FNR { a[$1 $2]=1 ; } NR>FNR { if ( $1 $2 in a ) print ;}'

onde

  • NR==FNR Número de registros == Número de registros do arquivo (estamos no primeiro arquivo)
  • { a[$1 $2]=1 ; } chave da loja (concatenação sem espaço)
  • NR>FNR (estamos no segundo arquivo)
  • if ( $1 $2 in a ) se o índice estiver presente ...
  • print imprime a linha.

que dão para você amostra

2    test1
3 test2
4   test2
    
por 23.03.2017 / 16:07
5
awk 'n[$1][$2]++'   file1 file2

Supondo que não haja duplicatas em nenhum dos arquivos.

    
por 23.03.2017 / 16:10
0
perl -lane '@ARGV and $h{"@F"}++,next; print if $h{"@F"}' file1 file2

Saída

2    test1
3 test2
4   test2
    
por 23.03.2017 / 17:42