通过管道搜索模式到 Sed 中删除文件中的行

Posted

技术标签:

【中文标题】通过管道搜索模式到 Sed 中删除文件中的行【英文标题】:Delete lines in a file by piping search pattern into Sed 【发布时间】:2016-12-14 05:20:13 【问题描述】:

我们是否可以像下面这样删除文件中的行。

grep 搜索模式 文件 |切-c 1-9 | sed 文件

无论我搜索什么,实际出现的次数可能少于我要删除的行数。 我想实际搜索并获取前 9 个字符并再次搜索并删除输出中的任何行。

我的输入文件如下所示。

0002206993022      Enrollment Status             Terminated                              08/01/201412/31/9999 
0003119343022      Enrollment Status             Terminated                              05/28/201512/31/9999
0003119343009999   Pay Status                    N/A                                     09/10/201405/28/2015

您可以搜索所有“已终止”人员并通过获取第一列中的前 9 位数字来获取他们的 ID。我想删除他们的所有记录,无论是支付状态还是注册状态或其他任何记录

【问题讨论】:

请提供正确的输入数据和输出数据。 @Mark,这有帮助吗?你现在能回答吗? 这是输入。输出呢? 抱歉,目前还很不清楚,至少对我来说,你想要什么。 我认为 OPS 想要找到所有被终止人员的 ID,并从找到的 ID 开始删除所有记录(也是 Pay Status)。 【参考方案1】:

你想要这样的东西:

awk '/Terminated/$0=substr($0, 1, 9);print "^" $0' file | grep -vf - file

更新:

尝试(非GNU grep):

awk '/Terminated/$0=substr($0, 1, 9);print "^" $0' file | grep -vf /dev/stdin file

测试:

$ cat file
0002206993022      Enrollment Status             Terminated                              08/01/201412/31/9999 
0003119343022      Enrollment Status             Terminated                              05/28/201512/31/9999
0003119343009999   Pay Status                    N/A                                     09/10/201405/28/2015
1003119343009999   Pay Status                    N/A                                     09/10/201405/28/2015

$ awk '/Terminated/$0=substr($0, 1, 9);print "^" $0' file | grep -vf - file
1003119343009999   Pay Status                    N/A                                     09/10/201405/28/2015

【讨论】:

非常好,但不幸的是,sysin 的“-”在 AIX 中不起作用。我得到以下错误。 "grep: 打不开-" 谢谢你,我需要在我的操作系统中找出标准输入的路径。我检查了/bin/stdin、/etc/stdin、/dev/stdin。 @Ahmad,试试看:/proc/self/fd/0 @Ahmad,或者试试:grep -vf <(awk '/Terminated/$0=substr($0, 1, 9);print "^" $0' file) file

以上是关于通过管道搜索模式到 Sed 中删除文件中的行的主要内容,如果未能解决你的问题,请参考以下文章

sed 或 awk:删除模式后面的 n 行

删除文件中与模式不匹配的行

sed删除怎么生效

sed

如何使用sed与模式文件和sed到位

使用 sed 删除所有以模式 b 开头的行,然后是模式 a 的行