Możesz przyjrzeć się aplikacjom uniq
i sort
.
./yourscript.ksh | sortuj | uniq
(FYI, tak, sortowanie jest konieczne w tym wierszu poleceń, uniq
usuwane są tylko zduplikowane linie, które są bezpośrednio po sobie)
EDYTOWAĆ:
W przeciwieństwie do tego, co napisał Aaron Digulla w związku z uniq
opcjami wiersza poleceń:
Biorąc pod uwagę następujące dane wejściowe:
klasa
słoik
słoik
słoik
kosz
kosz
Jawa
uniq
wypisze wszystkie wiersze dokładnie raz:
klasa
słoik
kosz
Jawa
uniq -d
wyświetli wszystkie wiersze, które pojawiają się więcej niż raz, i wydrukuje je raz:
słoik
kosz
uniq -u
wyświetli wszystkie wiersze, które pojawiają się dokładnie raz, i wydrukuje je raz:
klasa
Jawa
sort
oferuje również-u
wersję umożliwiającą podawanie unikalnych wartości.uniq
szwy przetwarzają tylko sąsiednie linie (przynajmniej domyślnie), co oznacza, że możnasort
wprowadzić przed karmieniemuniq
.Jest to to samo co odpowiedź monotlenku , ale nieco bardziej zwięzłe.
źródło
... | sort | uniq
dlatego, że wykonuje się je jednym strzałemW przypadku większych zestawów danych, w których sortowanie może nie być pożądane, możesz również użyć następującego skryptu perl:
To po prostu zapamiętuje każde wyjście liniowe, aby nie wyprowadzało go ponownie.
Ma tę przewagę nad rozwiązaniem „
sort | uniq
”, że nie wymaga sortowania z góry.źródło
Z zsh można to zrobić:
Lub możesz użyć AWK:
źródło
awk
rozwiązanie ( wyjaśnienie znajduje się na stackoverflow.com/a/21200722/45375 ) będzie działać z dużymi plikami, o ile liczba unikalnych wierszy jest wystarczająco mała (ponieważ unikatowe wiersze są przechowywane w pamięci ).zsh
Rozwiązanie czyta cały plik do pamięci pierwszy, który nie może być opcja z dużymi plikami. Ponadto, jak napisano, poprawnie obsługiwane są tylko wiersze bez osadzonych spacji; aby to naprawić, użyjIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
zamiast tego.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
sufiksu, aby odwoływać się do wszystkich elementów tablicy - wydaje się, że - przynajmniej od wersji 5 - działa bez niej; czy dodałeś to dla jasności?print -l "${(fu)$(<infile)}"
awk
próbkę wyjściową.Przeprowadź je przez
sort
iuniq
. To usuwa wszystkie duplikaty.uniq -d
daje tylko duplikaty,uniq -u
daje tylko te unikalne (paski duplikaty).źródło
uniq -u
NIE jest zachowaniem domyślnym (szczegóły w edycji w mojej odpowiedzi)Dzięki AWK możesz to zrobić, uważam, że jest to szybsze niż sortowanie
źródło
Unikalny, zgodnie z prośbą (ale nie posortowany);
zużywa mniej zasobów systemowych na mniej niż ~ 70 elementów (zgodnie z czasem);
napisane, aby pobrać dane wejściowe ze standardowego wejścia
(lub zmodyfikować i dołączyć do innego skryptu):
(Bash)
źródło
Dostaję lepsze wskazówki, aby uzyskać nieplikowe wpisy w pliku
źródło