通过管道搜索模式到 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 中删除文件中的行的主要内容,如果未能解决你的问题,请参考以下文章