Método 1: grep & awk
Você pode usar este snippet para fazer isso:
$ grep -f <(awk -F '|' '{print $5}' file1) file2
Connect|20130320000025|UTC|PPP|[email protected]|[email protected]|0BCBE578|
Detalhes
O bit que usa awk
analisa o primeiro arquivo, file1
retirando todas as 5 colunas. Esses valores são usados como uma lista para grep
, que imprimirá qualquer linha no segundo arquivo que contenha uma correspondência.
Advertências com este método
Este método corresponderá a qualquer ocorrência da quinta coluna de file1
em file2
.
Método # 2: apenas awk
Outra abordagem que foi usada no site no passado é usar a instalação FNR de awk
. É aqui que awk
irá iterar mais de 2 arquivos, passando pelo segundo arquivo linha por linha, para cada linha no primeiro.
Uma abordagem como essa faria isso. Coloque o seguinte em um arquivo, cmds.awk
:
FNR == NR {
f1[$5] = $5
next
}
{ if ($5 == f1[$5]) print $0; }
Você pode executar isso da seguinte maneira:
$ awk -F '|' -f cmds.awk file1 file2
OBSERVAÇÃO: você poderia ter usado este padrão awk
:
FNR == NR {
f1[$5] = $5
next
}
{ if ($5 in f1) print $0; }
Exemplo
$ awk -F '|' -f s.awk file1 file2
Connect|20130320000025|UTC|PPP|[email protected]|[email protected]|0BCBE578|
Advertências com este método
Essa abordagem só pode manipular uma única instância de cada endereço de email de file1
. Portanto, se houver duas linhas que tenham o mesmo valor para a quinta coluna, isso não conseguirá distinguir entre elas. Isso parece aceitável, considerando suas necessidades no OP.
Participe & classificar
Você também pode fazer isso usando join
e sort
.
$ join -t '|' -j 5 <(sort -k5,5 file2) <(sort -k5,5 file1) | sed 's/||.*//'
Isso usará o separador |
e unirá os arquivos classificados na quinta coluna. Essa abordagem imprime as correspondências de file1
e file2
, por isso usamos sed
para dividir a segunda partida do final.
Exemplo
$ join -t '|' -j 5 <(sort -k5,5 file2) <(sort -k5,5 file1) | sed 's/||.*//'
[email protected]|Connect|20130320000025|UTC|PPP|[email protected]|0BCBE578