Você está enfrentando um problema teórico. sort
não pode imprimir nada até que tenha processado toda a entrada. uniq
irá apenas apertar linhas repetidas (por isso é tão frequentemente precedido por sort
), então sua saída será diferente da sua entrada somente se a entrada tiver a mesma linha duas vezes seguidas. Se sua entrada for apenas um pouco aleatória, você provavelmente não notará a diferença.
Sua melhor aposta é um programa perl simples que lê a linha de entrada por linha e verifica se já foi visto. Caso contrário, imprime a entrada e a adiciona à tabela de hash das entradas já vistas.
#!/usr/bin/perl
my %LINES ;
while (<STDIN>) {
if (! $LINES{$_}) {
$LINES{$_} = 1 ;
print $_ ;
}
}
Naturalmente, sua lista de linhas já vistas crescerá, assim como a memória do seu programa.
Não sei ao certo para que você usaria isso, mas acho que adicionaria a data atual à impressão e, talvez, ao hash para que se pudesse remover entradas depois de n horas .