如何删除字符串前一行和后两行?

发布于 2024-09-12 14:11:51 字数 113 浏览 2 评论 0原文

假设您的文本文件中有如下所示的记录:

header
data1
data2
data3

如果 data1 是给定字符串,我想删除整个记录。我认为这需要 awk,我不知道。

Say you have records in a text file which look like this:

header
data1
data2
data3

I would like to delete the whole record if data1 is a given string. I presume this needs awk which I do not know.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

日裸衫吸 2024-09-19 14:11:51

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 }

Awk can handle these multiline records by setting the record separator to the empty string:

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

You can save this in a file (eg remove.awk) and execute it with awk -f remove.awk data.txt > newdata.txt

This assumes your data is of the format:

header
data
....

header
data
...

If there are no blank lines between the records, you need to manually split the records (this is with 4 lines per record):

{ 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 }
偏爱你一生 2024-09-19 14:11:51

不知道您想要什么输出并且样本输入不足。

awk 'BEGIN{RS=""}!/data1/' file

without knowing what output you desired and insufficient sample input.

awk 'BEGIN{RS=""}!/data1/' file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文