Вы можете захотеть взглянуть на uniq
и sort
приложениях.
./yourscript.ksh | сортировать | уник
(К вашему сведению, да, сортировка необходима в этой командной строке, uniq
удаляются только дубликаты строк, которые идут сразу после друг друга)
РЕДАКТИРОВАТЬ:
Вопреки тому, что было опубликовано Аароном Дигуллой в отношении uniq
параметров командной строки:
Учитывая следующий вход:
класс
яс
яс
яс
бункер
бункер
Ява
uniq
выведет все строки ровно один раз:
класс
яс
бункер
Ява
uniq -d
выведет все строки, которые появляются более одного раза, и напечатает их один раз:
яс
бункер
uniq -u
выведет все строки, которые появляются ровно один раз, и напечатает их один раз:
класс
Ява
sort
есть-u
версия для предоставления уникальных значений.uniq
швы для обработки только смежных линий (по крайней мере, по умолчанию) означает, что можноsort
вводить до кормленияuniq
.Это то же самое, что и ответ по оксиду , но более краткий.
источник
... | sort | uniq
потому, что это выполняется за один выстрелДля больших наборов данных, где сортировка может быть нежелательна, вы также можете использовать следующий скрипт perl:
Это в основном просто запоминает каждую строку вывода, чтобы он не выводил ее снова.
Он имеет преимущество перед «
sort | uniq
» решением в том, что не требуется предварительной сортировки.источник
С Zsh вы можете сделать это:
Или вы можете использовать AWK:
источник
awk
решение (см. Stackoverflow.com/a/21200722/45375 для объяснения) будет работать с большими файлами, если количество уникальных строк достаточно мало (так как уникальные строки хранятся в памяти ).zsh
Решение читает весь файл в память первым, которая не может быть вариантом с большими файлами. Кроме того, как написано, только строки без встроенных пробелов обрабатываются правильно; чтобы исправить это, используйтеIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
вместо этого.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
суффикс для ссылки на все элементы массива - кажется, что - по крайней мере, начиная с версии 5 - он работает без него; или вы просто добавили это для ясности?print -l "${(fu)$(<infile)}"
awk
пример вывода.Труба их через
sort
иuniq
. Это удаляет все дубликаты.uniq -d
дает только дубликаты,uniq -u
дает только уникальные (дубликаты полос).источник
uniq -u
это НЕ поведение по умолчанию (подробности см. В редактировании моего ответа)С AWK вы можете сделать, я нахожу это быстрее, чем сортировать
источник
Уникальный, как и было запрошено (но не отсортировано);
использует меньше системных ресурсов для менее чем ~ 70 элементов (как проверено временем);
написано для ввода данных из stdin,
(или изменить и включить в другой скрипт):
(Bash)
источник
Я получаю лучшие советы, чтобы получить не повторяющиеся записи в файле
источник