Удаление повторяющихся строк без сортировки

У меня есть скрипт утилиты в Python:

#!/usr/bin/env python import sys unique_lines = [] duplicate_lines = [] for line in sys.stdin: if line in unique_lines: duplicate_lines.append(line) else: unique_lines.append(line) sys.stdout.write(line) # optionally do something with duplicate_lines 

Эта простая функциональность (uniq без необходимости сортировки первого, стабильного порядка) должна быть доступна как простая утилита UNIX, не так ли? Может быть, комбинация фильтров в трубе?

Причина для запроса: нужна эта функциональность в системе, на которой я не могу выполнить python из любого места

Блог UNIX Bash Scripting предлагает :

 awk '!x[$0]++' 

Эта команда сообщает awk, какие строки печатать. Переменная $0 содержит все содержимое строки, а квадратные скобки – это доступ к массиву. Таким образом, для каждой строки файла узел массива x увеличивается и строка выводится, если ранее содержимое этого узла не было ( ! ).

Поздний ответ – я просто столкнулся с дубликатом этого вопроса, но, возможно, стоит добавить …

Принцип ответа @ 1_CR может быть написан более сжато, используя cat -n вместо awk для добавления номеров строк:

 cat -n file_name | sort -uk2 | sort -nk1 | cut -f2- 
  • Используйте cat -n для добавления номеров строк
  • Использовать sort -u удалить дубликаты данных
  • Используйте sort -n для сортировки по добавочному номеру
  • Используйте cut для удаления нумерации строк

Решение Майкла Хоффмана выше короткое и сладкое. Для более крупных файлов подход преобразования Шварца, включающий добавление поля индекса с использованием awk, сопровождаемого несколькими раундами сортировки и uniq, требует меньшего объема служебных данных. Следующий сниппет работает в bash

 awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t' 

Спасибо 1_CR! Мне нужно было «uniq -u» (удалить дубликаты целиком), а не uniq (оставить 1 копию дубликатов). Решения awk и perl не могут быть изменены, чтобы сделать это, ваши возможности! Возможно, мне также понадобилось более низкое использование памяти, так как я буду uniq’ing, как 100 000 000 строк 8-). На всякий случай, если кому-то это понадобится, я просто поставлю «-u» в команде uniq команды:

 awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq -u --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t' 

Чтобы удалить дубликат из 2 файлов:

 awk '!a[$0]++' file1.csv file2.csv 

Я просто хотел удалить все дубликаты в следующих строках, а не везде в файле. Поэтому я использовал:

 awk '{ if ($0 != PREVLINE) print $0; PREVLINE=$0; }' 

команда uniq работает в псевдониме даже http://man7.org/linux/man-pages/man1/uniq.1.html

Теперь вы можете проверить этот небольшой инструмент, написанный на Rust: uq .

Он выполняет фильтрацию уникальности без необходимости сначала сортировать вход, поэтому может применяться к непрерывному streamу.

  • Просмотр списка фильтров Android
  • В Excel VBA, как мне сохранить / восстановить определяемый пользователем фильтр?
  • Поверните изображение MATLAB в изображение
  • Использование File.listFiles с FileNameExtensionFilter
  • Как фильтровать массив из всех элементов другого массива
  • Как использовать AutoCompleteTextView и заполнять его данными из веб-API?
  • Как фильтровать возвращаемые данные из jQuery.ajax ()?
  • Как написать специальный фильтр в весенней безопасности?
  • Что такое фильтры намерений в Android?
  • список по сравнению с lambda + filter
  • Добавить признанное изображение в элементы wp_nav_menu
  • Давайте будем гением компьютера.