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 -n
pré-adicionará o número da linha a cada linha seguindo uma certa quantidade de espaços e seguido por um caractere < tab > .cat
canaliza essa representação de entrada parasort
. -
A opção
sort
-k2
instrui apenas a considerar os caracteres do segundo campo até o final da linha durante a classificação esort
divide os campos por padrão no espaço em branco (oucat
de espaços inseridos e < tab > ) .
Quando seguido por-k1n
,sort
considera primeiro o segundo campo e, em segundo lugar, no caso de campos-k2
idê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
sort
ordena no primeiro campo (cat
inserido 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,
cut
remove os números de linha que foram inseridos porcat
. Isso é afetado pela impressãocut
somente 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