Isto lê todas as linhas em a.txt
e mantém o controle de todos os seus valores da coluna 2. Em seguida, ele lê b.txt
e imprime todos os valores repetidos da coluna 2:
$ awk 'NR==FNR {seen[]=1; next} seen[]==1 {seen[]++; print }' a.txt b.txt
abcd
2dfg
O comando awk
pode ser dividido em duas partes. A primeira parte é:
NR==FNR {seen[]=1; next}
awk
primeiro testa se o número total de registros (linhas) processados, NR
, é o mesmo que o número de registros processados nesse arquivo, FNR
. Isso é verdade apenas para o primeiro arquivo processado, que é a.txt
nesse caso. Assim, para cada linha em a.txt
, a matriz associativa seen
com uma chave configurada para o valor da segunda coluna,
, é configurada para um valor de 1
. Isso será usado para indicar que esse valor da coluna 2 foi "visto" em a.txt
. O comando a seguir é next
, que diz awk
para pular o restante dos comandos e ir buscar o próximo registro.
A segunda parte é:
seen[]==1 {seen[]++; print }
Por causa do comando next
na primeira parte acima, essa parte é executada apenas pelo arquivo b.txt
. Esta parte começa com um teste: ele verifica se o valor da coluna-2,
, para este registro foi visto antes. Se foi visto antes uma vez, então os comandos entre chaves são executados. O primeiro comando entre chaves, seen[]++
incrementa o valor de seen
para que nunca mais processemos esse valor da coluna-2. (Consequentemente, os valores de repetição da coluna-2 são ignorados.) O segundo comando simplesmente imprime o valor da coluna-2 que havia sido visto antes em a.txt
.
Se pudermos confiar que não há valores repetidos para a coluna 2, é possível um script mais simples:
$ awk '{print }' a.txt b.txt | sort | uniq -d
2dfg
abcd