Aqui está uma opção usando o awk:
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print ""}' infile > outfile
Editar Atualizado com comentários:
-
while (++i<=NF)
Inicializa o loop while, precificando "i", pois $ 0 é a linha completa no awk.
Então começa em $ 1 (primeiro campo). Faz um loop na linha até o final (menor ou igual a 'NF'), que é embutido no awk para "Número de campos"). O separador de campos padrão é um espaço, você pode alterar o separador padrão facilmente.
-
printf (!a[$i]++) ? $i FS : ""
Esta é uma operação ternária .
Portanto, se a entrada não estiver na matriz
!a[$i]++
, ela imprimirá $ i, se for, imprimirá "". (Você poderia remover o!
e inverter o$i FS : ""
se você não gostar desse jeito). -
i=split("",a)
Normalmente, isso é uma divisão nula. Nesse caso, ele redefine a linha I para a próxima.
-
print ""
termina a linha da saída (não 100% porque, na verdade), caso contrário você teria uma saída de:
1 2 3 5 4 1 2 3
em vez de1 2 3
e5 4 1 2 3