从包含确切数字的文件中删除一行并在第一次查找和删除时退出
delete a line from a file containing the exact number and quit on the first find & delete
我试图只从一个文件中删除一个数值,而该文件可能有多个实例。
file_input=
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 ' !=8'
,但它们都删除了 8、8 和 18。
我建议使用 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
这是 awk
版本
$ awk '!(==8 && !c++)' ip.txt
2
4
18
8
10
12
14
==8 && !c++
检查第一个字段是否正好是 8
,如果是,则检查 c
的计算结果是否为 false(c
将递增,因此不会为 false下次)
- 当这是真的时我们不想打印,因此外部否定
- 即使第一个字段周围有空格,这也会起作用,就像在给定的示例中一样
我试图只从一个文件中删除一个数值,而该文件可能有多个实例。 file_input=
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 ' !=8'
,但它们都删除了 8、8 和 18。
我建议使用 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
这是 awk
版本
$ awk '!(==8 && !c++)' ip.txt
2
4
18
8
10
12
14
==8 && !c++
检查第一个字段是否正好是8
,如果是,则检查c
的计算结果是否为 false(c
将递增,因此不会为 false下次)- 当这是真的时我们不想打印,因此外部否定
- 即使第一个字段周围有空格,这也会起作用,就像在给定的示例中一样