Вы можете использовать команду sort
с опцией --unique
:
sort -u input-file
Если вы хотите записать результат в FILE вместо стандартного вывода, используйте опцию --output=FILE
:
sort -u input-file -o output-file
Команда uniq
также может быть применена. В этом случае идентичные строки должны быть последовательными, поэтому входные данные должны быть предварительно отсортированы - спасибо @RonJohn за эту заметку:
sort input-file | uniq > output-file
Мне нравится sort
команда для подобных случаев из-за ее простоты, но если вы работаете с большими массивами, awk
подход из ответа John1024 может быть более мощным. Вот сравнение времени между упомянутыми подходами, примененными к файлу (на основе приведенного выше примера) с почти 5 миллионами строк:
$ 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
Другое существенное отличие заключается в том, что упомянуто @Ruslan :
sort -u
будет печатать результат только после завершения ввода, в то время как эта awk
команда будет печатать каждую новую строку результатов на лету (это может быть важнее для ввода по каналу, чем для файла).
Вот иллюстрация:
В приведенном выше примере цикл (показан ниже) генерирует 500 случайных комбинаций, каждая из которых имеет длину три символа, из букв AD. Эти комбинации передаются по трубопроводу awk
или sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Если вы хотите сохранить выходные строки в том же порядке, что и входные строки, используйте:
Как это работает:
При этом используется ассоциативный массив
a
для подсчета количества раз, которое каждая строка была видна ранее. Если это не было замечено ранее, строка печатается.источник
awk
, ноsort -u
это простой способ.sort -u
также самый медленный способ :) Я обновил свой ответ сравнением времени между двумя подходами.sort -u
будет печатать результат только после завершения ввода, в то время как этаawk
команда будет печатать каждую новую строку результатов на лету (это может быть более важно для ввода по каналу, чем для файла).awk
решение очень хорошее, хотя и не так легко читается, какsort
.Здесь вы также можете использовать GNU
datamash
следующим образом и сохранить порядок строк.источник
time
сравнению это самое быстрое решение, представленное здесь.