Chcę posortować listę nazw domen (biała lista filtrów internetowych), zaczynając od TLD i pracując w górę. Szukam dowolnego narzędzia * nix lub Windows, które może to zrobić z łatwością, choć skrypt też byłby w porządku.
Więc jeśli jest to lista, którą otrzymałeś
www.activityvillage.co.uk
ajax.googleapis.com
akhet.co.uk
alchemy.l8r.pl
au.af.mil
bbc.co.uk
bensguide.gpo.gov
chrome.angrybirds.com
cms.hss.gov
crl.godaddy.com
digitalhistory.uh.edu
digital.library.okstate.edu
digital.olivesoftware.com
Właśnie tego chcę jako wynik.
chrome.angrybirds.com
crl.godaddy.com
ajax.googleapis.com
digital.olivesoftware.com
digital.library.okstate.edu
digitalhistory.uh.edu
bensguide.gpo.gov
cms.hss.gov
au.af.mil
alchemy.l8r.pl
www.activityvillage.co.uk
akhet.co.uk
bbc.co.uk
Na wypadek, gdybyś zastanawiał się, dlaczego, Squidguard, ma wadę / błąd w projekcie. Jeśli oba www.example.com
i example.com
oba umieszczone w wykazie, a następnie example.com
wejście jest ignorowany i można odwiedzić tylko zawartość z www.example.com
. Mam kilka dużych list, które wymagają uporządkowania, ponieważ ktoś dodał wpisy, nie patrząc najpierw.
com
domeny nie powinny pojawiać się wcześniejedu
na posortowanej liście?Odpowiedzi:
Ten prosty skrypt Pythona zrobi to, co chcesz. W tym przykładzie nazywam plik
domain-sort.py
:Aby go uruchomić, użyj:
Zauważ, że wygląda to trochę brzydiej, ponieważ napisałem to jako mniej więcej prostą jednowierszową musiałem użyć notacji plastra,
[::-1]
gdzie działają wartości ujemne, aby utworzyć kopię tej samej listy w odwrotnej kolejności, zamiast używać bardziej deklaratywnych,reverse()
które robi to na miejscu w sposób, który przerywa kompozycję.A oto nieco dłuższa, ale być może bardziej czytelna wersja, która używa,
reversed()
która zwraca iterator, stąd potrzeba również owinięcia go,list()
aby użyć iteratora i utworzyć listę:W przypadku pliku z 1500 losowo posortowanymi liniami zajmuje to około 0,02 sekundy:
W przypadku pliku z 150 000 losowo posortowanych linii zajmuje to nieco ponad 3 sekundy:
Tu jest zapewne bardziej czytelna wersja, że robi to
reverse()
isort()
na miejscu, ale to działa w tym samym czasie, a właściwie zajmuje nieco więcej pamięci.W przypadku pliku z 1500 losowo posortowanymi liniami zajmuje to około 0,02 sekundy:
W przypadku pliku z 150 000 losowo posortowanych linii zajmuje to nieco ponad 3 sekundy:
źródło
data.sort(key=lambda x: x[1:])
Oto skrypt PowerShell, który powinien robić, co chcesz. Zasadniczo rzuca wszystkie TLD do tablicy odwraca każdą TLD, sortuje ją, odwraca z powrotem do oryginalnej kolejności, a następnie zapisuje w innym pliku.
Uruchomiłem go na 1500 rekordach - zajęło 5 sekund na dość mocnym pulpicie.
źródło
cat domain.txt | rev | sortuj | obrót silnika
źródło
rev domain.txt|sort|rev
Nieco mniej tajemniczy, a przynajmniej ładniejszy Perl:
Jest to prosty przykład transformacji Guttmana – Roslera : konwertujemy linie do odpowiedniej formy do sortowania (tutaj dzielimy nazwę domeny na kropki i odwracamy kolejność części), sortujemy je przy użyciu rodzimego sortowania leksykograficznego, a następnie konwertujemy wiersze z powrotem do oryginalnej postaci.
źródło
W skryptach uniksowych: odwróć, sortuj i odwróć:
źródło
awk -F. '{for(i=NF;i>0;i--){printf ".%s",$i};printf "\t%s\n",$0}' file|sort|cut -f2
może najpierw zechcesz rozebrać lokalnych hostówgrep \. file | awk ...
Oto on (krótki i tajemniczy) perl:
źródło
/usr/bin/time -v
statystyk czasu, który upłynął, i maksymalnej pamięci.Powoduje to odwrócenie każdego pola w nazwie domeny, sortowanie i cofanie.
To naprawdę sortuje listę domen, leksykograficznie na podstawie każdej części nazwy domeny, od prawej do lewej.
Rozwiązanie odwrotne (
rev <<<filename>>> | sort | rev
) nie, próbowałem.źródło