Я выработал sed
ответ вскоре после того, как опубликовал этот вопрос; никто еще не использовал, sed
так что вот оно:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
Немного поиграв с более общей проблемой (как насчет удаления строк в наборах из трех? Или четырех или пяти?), Мы получили следующее расширяемое решение:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
Расширено для удаления тройки строк:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
Или удалить квадраты линий:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
обладает дополнительным преимуществом по сравнению с большинством других опций, которое заключается в его способности по-настоящему работать в потоке, при этом не требуется больше памяти, чем фактическое количество строк, проверяемых на наличие дубликатов.
Как отметил cuonglm в комментариях , установка языкового стандарта на C необходима, чтобы избежать сбоев в правильном удалении строк, содержащих многобайтовые символы. Таким образом, приведенные выше команды становятся:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
, в противном случае в многобайтовой локали недопустимый символ в этой локали приведет к сбою команды.Это не очень элегантно, но так просто, как я могу придумать:
Substr () просто обрезает
uniq
вывод. Это будет работать до тех пор, пока у вас не будет более 9 999 999 дубликатов строки (в этом случае вывод uniq может превысить 9 символов).источник
uniq -c input | awk '{if ($1 %2 == 1) { print $2 } }'
и это, казалось, работало одинаково хорошо. По какой причинеsubstr
версия лучше?$2
чтобы$NF
быть более надежными?foo bar
.uniq
(по крайней мере, в GNU coreutils), кажется, надежно использует ровно 9 символов перед самим текстом; Я не могу найти это нигде в документации, и это не в спецификации POSIX .Попробуйте этот
awk
скрипт ниже:Предполагается, что
lines.txt
файл отсортирован.Тест:
источник
С
pcregrep
для данного образца:или в более общем виде:
источник
Если вход отсортирован:
источник
pineapple\napple\ncoconut
и результат будетpinecoconut
.\n
вместо того, чтобы$
дать/m
модификатор, но потом я понял, что использование$
оставит пустую строку вместо удаленных строк. Хорошо выглядит сейчас; Я удалил неправильную версию, так как она просто добавила шум. :)Мне нравится
python
за это например сpython
2.7+источник
Как я понял, вопрос, который я выбрал для awk, используя хэш каждой записи, в этом случае я предполагаю, что RS = \ n, но его можно изменить, чтобы рассмотреть любые другие виды соглашений, он может быть рассмотрен для рассмотрения четное количество повторений, а не нечетное, с параметром или небольшим диалогом. Каждая строка используется в качестве хэша, и ее количество увеличивается, в конце файла массив сканируется и печатает каждый четный счет записи. Я включил счет для проверки, но удаления [x] достаточно, чтобы решить эту проблему.
НТН
код счетных линий
Образец данных:
Пробный прогон:
источник
awk
кода, но, к сожалению,awk
ассоциативные массивы вообще не упорядочены и не сохраняют порядок.sort
.!=0
это подразумевается тем, какawk
числа преобразуются в истинные / ложные значения, что делает это сводимым кawk '{a[$0]++}END{for(x in a)if(a[x]%2)print x}'
Если вход отсортирован, что об этом
awk
:источник
с Perl:
источник
Используя конструкции оболочки,
источник
$b
).Веселая головоломка!
В Perl:
Многословно в Хаскеле:
Кратко в Haskell:
источник
версия: я использую «разделители», чтобы упростить внутренний цикл (предполагается, что первая строка не является,
__unlikely_beginning__
и предполагается, что текст не заканчивается строкой:,__unlikely_ending__
и добавить эту специальную строку разделителя в конце вставленных строк. Таким образом, Алгоритм может предполагать оба:)Так :
источник