Как сохранить только те строки, следующая строка которых идентична - PullRequest
1 голос
/ 10 октября 2019

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

Пример

(записанный в файлеnamed test)

line
line
line
line1
line
line3
line1
line2
line2
line

Ожидаемый вывод

line
line
line2

Моя команда оболочки

cat test | sed -rn '$!N; /^(.*)\n\1/P; D'

Вывод

line
line
line
line
line2

Интересно, чтонеправильно в этой команде? Почему я получил 2 дополнительных line с ??

Ответы [ 3 ]

5 голосов
/ 10 октября 2019

Если вы в порядке с awk, не могли бы вы попробовать один раз.

awk 'prev==$0 && prev{print} {prev=$0}' Input_file

ИЛИ

awk 'prev==$0 && prev; {prev=$0}' Input_file

Объяснение: Добавление пояснения к приведенному выше коду сейчас.

awk '                 ##Starting awk program here.
prev==$0 && prev{     ##Checking condition if prev variable is equal to current line and prev is NOT NULL.
  print               ##Printing the current line then, as per OP request.
}                     ##Closing BLOCK for prev==$0 && prev condition here.
{
  prev=$0             ##Setting variable prev to current line.
}
' Input_file          ##Mentioning Input_file name here(which is getting passed to awk).
4 голосов
/ 10 октября 2019

Я бы не советовал использовать sed для этой задачи.

Однако у вас возникла лишь незначительная проблема с командой, которую вы пробовали. Вам необходимо полностью сравнить следующую строку, поэтому добавьте $ привязку после \1

$ sed -nE '$!N; /^(.*)\n\1$/P; D' ip.txt
line
line
line2


Без привязки line будет соответствовать строкам, таким как line1, linexyaz и т. Д. Если вы измените входные данные так, чтобы не было частичных совпадений, то ваша команда сработала бы

$ cat ip.txt
line
line
line
cline1
line
zline3
line1
line2
line2
line
$ sed -nE '$!N; /^(.*)\n\1/P; D' ip.txt
line
line
line2
0 голосов
/ 10 октября 2019

С (GNU sed) 4.2.2, который поддерживает -z:

sed -rz ':a;s/(^|\n)([^\a\n]*)\n\2\n/\1\2\a\n\2\n/g;ta;' test | sed -rn 's/\a$//p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...