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