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