Eu vejo duas maneiras de fazer isso:
-
iterar o arquivo duas vezes:
Na primeira iteração, conte o número de vezes que cada $ 2 aparece.
Na segunda iteração, imprima apenas linhas onde a contagem é maior que 1awk 'NR == FNR {count[$2]++; next} count[$2] > 1' file file
-
com uma única iteração dos dados:
Você precisa contar o número de vezes que cada $ 2 aparece, e lembrar quais linhas ocorreram para cada $ 2.
Esta resposta usa o GNU awk para array-of-arrays. A ordem da saída provavelmente não será a mesma dos dados de entrada. Também tem que armazenar o arquivo inteiro na memória.
gawk ' { lines[$2][++count[$2]] = $0 } END { for (x in lines) if (count[x] > 1) for (i=1; i<=count[x]; i++) print lines[x][i] } ' file
Testado com o arquivo de entrada:
$ cat file
a b
b b
c b
a c
a d
b d
a e
e saída esperada
a b
b b
c b
a d
b d