Как я могу удалить одну строку до и две после строки?

Скажем, у вас есть записи в текстовом файле, которые выглядят так:

header
data1
data2
data3

Я хотел бы удалить всю запись, если data1 является заданной строкой. Я предполагаю, что для этого нужен awk, которого я не знаю.


awk
person chx    schedule 04.08.2010    source источник


Ответы (2)


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

BEGIN { RS = ""; ORS = "\n\n" }
$2 == "some string" { next } # skip this record
{ print } # print (non-skipped) record

Вы можете сохранить это в файле (например, remove.awk) и выполнить его с помощью awk -f remove.awk data.txt > newdata.txt

Это предполагает, что ваши данные имеют формат:

header
data
....

header
data
...

Если между записями нет пустых строк, необходимо вручную разделить записи (это при 4-х строках на запись):

{ a[++i] = $0 }
i == 2 && a[i] == "some string" { skip = 1 }
i == 4 && ! skip { for (i = 1; i <= 4; i++) print a[i] }
i == 4 { skip = 0; i = 0 }
person schot    schedule 04.08.2010

не зная, какой результат вы хотите, и недостаточный ввод образца.

awk 'BEGIN{RS=""}!/data1/' file
person ghostdog74    schedule 04.08.2010