perl -lane '
exists $h{$F[0]} and undef $h{$F[0]},next;
( $h{$F[0]}, $h[@h] ) = ( $_, $F[0] );
END{ print $h{$_} for grep { defined $h{$_} } @h }
' yourfile
A operação do código analisa se o primeiro campo foi encontrado antes, então a chave por esse
nome existiria no hash, e assim vamos em frente e undef
o valor para esta chave em particular, como
não faz sentido construir um array que seja descartado no final. Em vez disso, carregamos a mesma informação por uma impressão de menor memória.
E no cenário de ver o primeiro campo na primeira vez, nós preenchemos o hash %h
com a linha atual e, simultaneamente, anexamos a matriz @h
com essa chave. Realizamos este passo para manter a ordem em que as chaves foram encontradas. Se não nos importamos com o pedido, podemos muito bem acabar com este passo.
Finalmente, quando todas as entradas foram digeridas, no final END
block, faça um loop sobre os elementos da matriz @h
e daqueles que pescam apenas aqueles para os quais o hash %h
tem valores definidos. Lembre-se, undef
significa que os valores devem ter visto mais de uma vez.