Este simples script python fará o que você quiser. Neste exemplo, nomeio o arquivo domain-sort.py
:
#!/usr/bin/env python
from fileinput import input
for y in sorted([x.strip().split('.')[::-1] for x in input()]): print '.'.join(y[::-1])
Para executar, use:
cat file.txt | ./domain-sort.py
Note que isso parece um pouco mais feio desde que eu escrevi isso como mais ou menos uma simples linha que eu tive que usar notação de fatia de [::-1]
onde valores negativos funcionam para fazer uma cópia da mesma lista na ordem inversa em vez de usar o mais declarativo reverse()
que o faz no local de uma forma que quebra a composibilidade.
E aqui está uma versão um pouco mais longa, mas talvez mais legível, que usa reversed()
, que retorna um iterador, daí a necessidade de também envolvê-lo em list()
para consumir o iterador e produzir uma lista:
#!/usr/bin/env python
from fileinput import input
for y in sorted([list(reversed(x.strip().split('.'))) for x in input()]): print '.'.join(list(reversed(y)))
Em um arquivo com 1.500 linhas classificadas aleatoriamente, leva ~ 0,02 segundos:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 21632
Em um arquivo com 150.000 linhas classificadas aleatoriamente, leva um pouco mais de 3 segundos:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.20
Maximum resident set size (kbytes): 180128
Aqui está uma versão mais legível que faz o reverse()
e sort()
no local, mas é executado na mesma quantidade de tempo e, na verdade, ocupa um pouco mais de memória.
#!/usr/bin/env python
from fileinput import input
data = []
for x in input():
d = x.strip().split('.')
d.reverse()
data.append(d)
data.sort()
for y in data:
y.reverse()
print '.'.join(y)
Em um arquivo com 1.500 linhas classificadas aleatoriamente, leva ~ 0,02 segundos:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
Maximum resident set size (kbytes): 22096
Em um arquivo com 150.000 linhas classificadas aleatoriamente, leva um pouco mais de 3 segundos:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.08
Maximum resident set size (kbytes): 219152