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