Solução Python pedida
Se a ordem é importante, aqui está o que podemos fazer em python como uma linha:
$ python -c 'import sys;from collections import OrderedDict; d=OrderedDict( (i,True) for i in sys.argv[1].split(":") );print ":".join(d.keys())' 'apple:orange:apple:.:pear:mango:.:apple'
apple:orange:.:pear:mango
Um pouco longo, para podermos transformá-lo em um pequeno script:
#!/usr/bin/env python
from collections import OrderedDict
import sys
d=OrderedDict( (i,True) for i in sys.argv[1].split(":") )
print ":".join(d.keys())
E use-o da seguinte forma:
$ ./uniq_tokens.py 'apple:orange:apple:.:pear:mango:.:apple'
apple:orange:.:pear:mango
A maneira como isso funciona:
- nós damos a string que desejamos processar como argumento de linha de comando, por isso usamos
sys
module para nos referirmos a sys.argv[1]
-
% de
sys.argv[1]
get é dividido em tokens usando :
como separador
-
(i,True) for i in sys.argv[1].split(":")
nos permite criar uma lista de tuplas com dois valores, onde True
é apenas valor fictício
-
OrderedDict
, em seguida, pega isso e cria um dicionário de pares de valores-chave. Esta é uma maneira "barata" de fazer o conjunto ordenado com compreensão de listas como alternativa à compreensão de dit. Se a string já existir como chave, ela permanecerá exclusiva ( a menos que alguém faça algo desnecessário )
-
":".join()
nos permitirá pegar todos os tokens que dividimos (por isso usamos d.keys()
aqui), e converter de volta para uma string inteira legal associada a :
- a impressão é autoexplicativa.
Solução Python não ordenada (mas mais curta)
Se o pedido não importa, podemos obter uma solução mais curta (mas isso é mais por diversão do que por aplicação prática - provavelmente 99% do tempo em que você deseja preservar a ordem dos tokens):
$ python -c 'import sys;print ":".join(set(sys.argv[1].split(":")))' 'a:bc:d:a:hi:p:a'
a:p:hi:d:bc
A maneira como isso funciona é simples:
- nós passamos a string desejada como argumento de linha de comando, portanto, precisamos que
import sys
se refira ao primeiro argumento de linha de comando como sys.argv[1]
- agora, vamos desembrulhar essa segunda parte;
sys.argv[1].split(":")
nos dá uma lista de tokens do que originalmente era uma string inteira, e nós dividimos usando :
como separador para tokens individuais
-
set()
terá essa lista de strings mencionada acima e nos fornecerá valores exclusivos
- agora, precisamos converter essa coleção de strings de volta em uma string inteira, e é por isso que usamos
":".join()
para unir todos os tokens novamente usando :
como separador.
-
print
é auto-explicativo. Note que esta é a sintaxe do Python 2.7. Use print()
para o Python 3
E aqui está o teste com outras strings:
$ python -c 'import sys;print ":".join(set(sys.argv[1].split(":")))' 'apple:orange:apple:.:pear:mango:.:apple'
orange:mango:pear:apple:.