Eu duvido que isso faça a diferença, mas, apenas no caso, aqui está como fazer a mesma coisa em Perl:
perl -ne 'print if ++$k{$_}==1' out.txt
Se o problema é manter as linhas exclusivas na memória, isso terá o mesmo problema que o awk que você tentou. Então, outra abordagem poderia ser:
cat -n out.txt | sort -k2 -k1n | uniq -f1 | sort -nk1,1 | cut -f2-
Como funciona:
-
Em um sistema GNU,
cat -npré-adicionará o número da linha a cada linha seguindo uma certa quantidade de espaços e seguido por um caractere < tab > .catcanaliza essa representação de entrada parasort. -
A opção
sort-k2instrui apenas a considerar os caracteres do segundo campo até o final da linha durante a classificação esortdivide os campos por padrão no espaço em branco (oucatde espaços inseridos e < tab > ) .
Quando seguido por-k1n,sortconsidera primeiro o segundo campo e, em segundo lugar, no caso de campos-k2idênticos, considera o primeiro campo, mas como numericamente ordenado. Assim, as linhas repetidas serão classificadas juntas, mas na ordem em que apareceram. - Os resultados são canalizados para
uniq- que é instruído a ignorar o primeiro campo (-f1- e também separado por espaço em branco) - e que resulta em uma lista de linhas exclusivas em o arquivo original e é redirecionado parasort. - Desta vez
sortordena no primeiro campo (catinserido o número da linha) numericamente, obtendo a ordem de classificação de volta para o que estava no arquivo original e canaliza esses resultados paracut. - Por último,
cutremove os números de linha que foram inseridos porcat. Isso é afetado pela impressãocutsomente do segundo campo até o final da linha (e o delimitador padrão decuté um < tab> ) .
Para ilustrar:
$ cat file
bb
aa
bb
dd
cc
dd
aa
bb
cc
$ cat -n file | sort -k2 | uniq -f1 | sort -k1 | cut -f2-
bb
aa
dd
cc