Compare a segunda coluna do primeiro arquivo e a primeira coluna do segundo arquivo e imprima os registros correspondentes do primeiro arquivo

1

Eu tenho dois arquivos grandes:

f1.txt:

5020118359      |13ZJ24001218                  |20141224|R
5020120475      |13ZJ38000813                  |20141204|R
5020127431      |13ZJ38001569                  |20141201|R
5020127689      |12ZJ44000606                  |20141203|R
5020127728      |13ZJ38001356                  |20141203|R
5020127956      |13ZJ62002544                  |20141205|R
5020127972      |13ZJ49000082                  |20141205|R
5020128325      |13ZJ57000785                  |20141210|R
5020128706      |13ZJ38002805                  |20141211|R
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

f2.txt:

09Y903010552
12ZJ54000041
11XJ62118385
08Y909018946
09Y902011954
11XJ57120346
10XJ70107764
11XJ40165329
09XJ42008336
08Y912021435
11XJ51040272
07Y910027235

Saída:

5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

ele irá comparar a segunda coluna do primeiro arquivo e a primeira coluna do segundo arquivo e depois imprimirá os registros correspondentes do primeiro arquivo.

    
por Ranjit 22.01.2016 / 17:55

2 respostas

0

Você tentou com awk ? Isso poderia ser facilmente implementado em awk . Aqui está uma solução diferente:

egrep $(tr '\n' '|' < f2.txt | sed 's/|$//') f1.txt

tr é usado para substituir todos os caracteres de nova linha por | , sed é usado para remover o | (aposto que há uma maneira mais elegante de fazer isso, sem invocar outro subprocesso) e então isso é usado como argumento para egrep = grep -e .

    
por 22.01.2016 / 18:15
0

No exemplo simples mostrado, você pode usar grep , dando a ele f2 como a lista de padrões para pesquisar ( -f ):

$ grep -wf f2.txt f1.txt 
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

O -w faz com que grep procure somente as correspondências "palavra inteira", de modo que foobar não seja considerado uma correspondência para foo .

Para casos mais complexos em que, por exemplo, f2.txt pode ter várias colunas ou onde os dados em f2.txt podem aparecer em qualquer coluna de f1.txt , mas você quer apenas os casos em que aparece na coluna 1, pode usar awk :

$ awk -F'[ |]+' 'NR==FNR{a[$1]++; next}($2 in a )' f2.txt f1.txt 
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

O -F define o separador de campo como um ou mais | ou espaço. NR é o número da linha atual e FNR é o número da linha do arquivo atual. Quando vários arquivos são fornecidos como entrada, os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Portanto, o a[$1]++; next será executado para cada linha do primeiro arquivo. Como o primeiro arquivo é f2.txt , isso salvará cada um dos primeiros campos de f2.txt na matriz a . O next pula para a próxima linha.

Então, quando chegarmos ao próximo arquivo, se seu segundo campo estiver no array, então a declaração ( $2 in a) será verdadeira e awk irá imprimir a linha. Esta é a ação padrão para quando uma afirmação avalia para true É apenas uma versão abreviada de:

awk -F'[ |]+' '{
                 if(NR==FNR){ 
                    a[$1]++; 
                 }
                 else if($2 in a ){
                    print
                 }
                }' f2.txt f1.txt 
    
por 24.01.2016 / 18:59