Możesz użyć polecenia sort
z opcją --unique
:
sort -u input-file
Jeśli chcesz zapisać wynik do PLIKU zamiast standardowego wyjścia, użyj opcji --output=FILE
:
sort -u input-file -o output-file
Polecenie uniq
można również zastosować. W tym przypadku identyczne linie muszą być konsekwentne, więc dane wejściowe należy posortować wstępnie - dzięki @RonJohn za tę notatkę:
sort input-file | uniq > output-file
Podoba mi się sort
polecenie dla podobnych przypadków, ze względu na jego prostotę, ale jeśli pracujesz z dużymi tablicami, awk
podejście z odpowiedzi John1024 może być silniejsze. Oto porównanie czasowe między wspomnianymi podejściami zastosowanymi w pliku (na podstawie powyższego przykładu) z prawie 5 milionami linii:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
Kolejną znaczącą różnicą jest , że wspomniane przez @Ruslan :
sort -u
wypisze wynik dopiero po zakończeniu wprowadzania, podczas gdy to awk
polecenie wydrukuje każdą nową linię wyniku w locie (może to być ważniejsze dla wprowadzania potokowego niż pliku).
Oto ilustracja:
W powyższym przykładzie pętla (pokazana poniżej) generuje 500 losowych kombinacji, każda o długości trzech znaków, liter AD. Te kombinacje są przesyłane do awk
lub sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Jeśli chcesz zachować linie wyjściowe w tej samej kolejności co linie wejściowe, użyj:
Jak to działa:
Wykorzystuje tablicę asocjacyjną
a
do zliczania liczby wyświetleń każdej linii. Jeśli nie był wcześniej widziany, linia jest drukowana.źródło
awk
, alesort -u
jest to prosty sposób.sort -u
jest to również najwolniejszy sposób :) Zaktualizowałem swoją odpowiedź porównując czas między tymi dwoma podejściami.sort -u
wydrukuje wynik dopiero po zakończeniu wprowadzania, podczas gdy toawk
polecenie wydrukuje każdą nową linię wyniku w locie (może to być ważniejsze w przypadku wprowadzania potokowego niż pliku).awk
rozwiązanie jest bardzo dobre, choć nie tak łatwe do odczytania jaksort
.Możesz użyć GNU
datamash
tutaj również w następujący sposób i zachowa kolejność linii.źródło
time
porównania jest to najszybsze rozwiązanie, podane tutaj.