awk: как удалить повторяющиеся строки в файле и одновременно вывести их в другой файл?

В настоящее время я работаю над скриптом, который обрабатывает CSV-файлы, и одна из вещей, которые он делает, — это удаление и сохранение повторяющихся строк в файлах. Мой текущий метод сделать это - запустить uniq один раз, используя uniq -d один раз, чтобы отобразить все дубликаты, а затем снова запустить uniq без каких-либо опций для фактического удаления дубликатов. Сказав это, мне было интересно, можно ли выполнить эту же функцию за одно действие вместо того, чтобы запускать uniq дважды. Я нашел множество различных примеров использования awk для удаления дубликатов, но, насколько я знаю, мне не удалось найти ни одного, который одновременно отображал бы дубликаты и удалял их. Если кто-то может предложить совет или помощь в этом, я был бы очень признателен, хотя, спасибо!


person lacrosse1991    schedule 29.11.2012    source источник
comment
Стандартный ответ на все вопросы по работе с текстом: да, в awk это тривиально. Теперь - что вы хотите сделать? Опубликуйте небольшой пример ввода, ожидаемый результат после запуска нужного инструмента на этом вводе и объяснение, почему это будет вывод.   -  person Ed Morton    schedule 29.11.2012


Ответы (3)


Вот кое-что для начала:

awk 'seen[$0]++{print|"cat>&2";next}1' file > tmp && mv tmp file

Вышеприведенное будет печатать любые повторяющиеся строки в stderr одновременно с удалением их из вашего входного файла. Если вам нужно больше, сообщите нам больше ....

person Ed Morton    schedule 29.11.2012

В общем, размер вашего ввода должен быть вашим ориентиром. Если вы обрабатываете гигабайты данных, у вас часто нет другого выбора, кроме как полагаться на sort и uniq, потому что эти инструменты поддерживают внешние операции.

Тем не менее, вот способ AWK:

  • Если ваш ввод отсортирован, вы можете легко отслеживать повторяющиеся элементы в AWK, сравнивая строку i со строкой i-1 с состоянием O(1): если i == i-1 у вас есть дубликат.

  • Если ваш ввод не отсортирован, вы должны отслеживать все строки, требующие состояния O(c), где c — количество строк. уникальные линии. Для этой цели вы можете использовать хеш-таблицу в AWK.

person mavam    schedule 29.11.2012

Это решение не использует awk, но дает нужный вам результат. В приведенной ниже команде замените sortedfile.txt вашим CSV-файлом.

cat sortedfile.txt | tee >(uniq -d > duplicates_only.txt) | uniq > unique.txt

tee отправляет вывод команды cat в uniq -d.

person dinesh    schedule 29.11.2012
comment
Тем не менее, потеряйте бесполезное использование кошки. - person tripleee; 30.11.2012