从包含确切数字的文件中删除一行并在第一次查找和删除时退出
Posted
技术标签:
【中文标题】从包含确切数字的文件中删除一行并在第一次查找和删除时退出【英文标题】:delete a line from a file containing the exact number and quit on the first find & delete 【发布时间】:2017-12-28 13:43:32 【问题描述】:我试图只从一个可能有多个该值实例的文件中删除一个数值。 文件输入=
2
4
18
8
8
10
12
14
我需要删除“8”,但只删除一次,我想保留“18”。最终结果应该在 file_output 中:
2
4
18
8
10
12
14
我尝试了sed '/8/d'
、grep -v -w '8'
和awk '$1 !=8'
,但它们都删除了 8、8 和 18。
【问题讨论】:
如何将'8'替换为$number之类的var,因为在使用时可以调用此函数删除不同的数字? 带变量:n="8"; sed '1,/^'"$n"'$//^'"$n"'$/d' file
【参考方案1】:
我建议使用 GNU sed:
sed '1,/^8$//^8$/d' file
输出:
2 4 8 10 12 14从第一行到仅包含 8
(1,/^8$/
) 的行删除仅包含 8
(/^8$/d
) 的行。
请参阅:man sed
和 The Stack Overflow Regular Expressions FAQ
【讨论】:
即使我在值 8 之前添加 88,也可以按我的意愿工作。太好了,谢谢。 当你必须多次编写相同的代码时(例如/^8$/
在这种情况下两次),这意味着你应该寻找不同的解决方案。【参考方案2】:
这是awk
版本
$ awk '!($1==8 && !c++)' ip.txt
2
4
18
8
10
12
14
$1==8 && !c++
检查第一个字段是否正好是 8
,如果是,检查 c
的计算结果是否为 false(c
将递增,因此下次不会为 false)
当这是真的时,我们不想打印,因此外部否定
即使第一个字段周围有空格,这也可以工作,就像给定的问题示例一样
【讨论】:
咳咳——双重否定?awk '$1==8 && !c++next 1' ip.txt
以上是关于从包含确切数字的文件中删除一行并在第一次查找和删除时退出的主要内容,如果未能解决你的问题,请参考以下文章