В настоящее время я работаю над скриптом, который обрабатывает CSV-файлы, и одна из вещей, которые он делает, — это удаление и сохранение повторяющихся строк в файлах. Мой текущий метод сделать это - запустить uniq один раз, используя uniq -d один раз, чтобы отобразить все дубликаты, а затем снова запустить uniq без каких-либо опций для фактического удаления дубликатов. Сказав это, мне было интересно, можно ли выполнить эту же функцию за одно действие вместо того, чтобы запускать uniq дважды. Я нашел множество различных примеров использования awk для удаления дубликатов, но, насколько я знаю, мне не удалось найти ни одного, который одновременно отображал бы дубликаты и удалял их. Если кто-то может предложить совет или помощь в этом, я был бы очень признателен, хотя, спасибо!
awk: как удалить повторяющиеся строки в файле и одновременно вывести их в другой файл?
Ответы (3)
Вот кое-что для начала:
awk 'seen[$0]++{print|"cat>&2";next}1' file > tmp && mv tmp file
Вышеприведенное будет печатать любые повторяющиеся строки в stderr одновременно с удалением их из вашего входного файла. Если вам нужно больше, сообщите нам больше ....
В общем, размер вашего ввода должен быть вашим ориентиром. Если вы обрабатываете гигабайты данных, у вас часто нет другого выбора, кроме как полагаться на sort
и uniq
, потому что эти инструменты поддерживают внешние операции.
Тем не менее, вот способ AWK:
Если ваш ввод отсортирован, вы можете легко отслеживать повторяющиеся элементы в AWK, сравнивая строку
i
со строкойi-1
с состоянием O(1): еслиi == i-1
у вас есть дубликат.Если ваш ввод не отсортирован, вы должны отслеживать все строки, требующие состояния O(c), где c — количество строк. уникальные линии. Для этой цели вы можете использовать хеш-таблицу в AWK.
Это решение не использует awk
, но дает нужный вам результат. В приведенной ниже команде замените sortedfile.txt вашим CSV-файлом.
cat sortedfile.txt | tee >(uniq -d > duplicates_only.txt) | uniq > unique.txt
tee
отправляет вывод команды cat
в uniq -d
.