我有一个文件,其内容与以下文件相似。
0
0
0.2
0
0
0
0
我需要删除所有带有单个零的行。
我正在考虑使用grep -v "0"
,但这也会删除包含0.2的行。我看到我可以使用该-w
选项,但这似乎也不起作用。
如何删除仅包含一个0的所有行,并保留所有以0开头的行?
-w
,此处失败。
我有一个文件,其内容与以下文件相似。
0
0
0.2
0
0
0
0
我需要删除所有带有单个零的行。
我正在考虑使用grep -v "0"
,但这也会删除包含0.2的行。我看到我可以使用该-w
选项,但这似乎也不起作用。
如何删除仅包含一个0的所有行,并保留所有以0开头的行?
-w
,此处失败。
Answers:
grep -vx 0
来自man grep
:
-x, --line-regexp
Select only those matches that exactly match the whole line.
For a regular expression pattern, this is like parenthesizing
the pattern and then surrounding it with ^ and $.
-w
失败,因为先0
入0.02
被认为是“单词”,因此该行是匹配的。这是因为其后跟一个“非单词”字符。如果运行不带的原始命令-v
,即可以看到此内容grep -w "0"
。
-F
选项,因为我们不使用正则表达式模式,仅使用纯字符串匹配
-F
我一起跑步(令我惊讶的是)似乎花费了类似的时间,甚至稍微慢一点(〜5–10%)。因此,我不确定会有什么好处。
grep
对于没有元字符的正则表达式,大概有一个特殊情况,因为这是一个常见的用例。令人惊讶的是它的fgrep
速度会变慢,但是与扫描大文件的时间相比,在编译短模式时注意到这种特殊情况的开销可以忽略不计,这并不奇怪。(如果需要某种特殊情况来加快速度,那么相对于具有字符类或x.*y
。的模式)
grep
将\n
换行符以外的其他字符识别为行分隔符。如果不是,则隐式^
和$
仍然可以变成固定字符串搜索,例如strstr(big_buf, "\n0\n")
。(或者0\n
在缓冲区的开头。)但是,我们不只是寻找可能进入较大缓冲区的第一个匹配项,还希望有效过滤。但是无论如何,从理论上讲,是的,每行的开头只是一个2字节的memcmp,您希望fgrep和grep都能看到这一点。
使用grep:
grep -v "^0$" file
^
表示行的开头,表示行的$
结尾。
[a-Z0-9]
尽管grep
可以用于此目的(其他答案清楚地表明),但让我们退后一步,思考一下您真正想要的是什么:
正则表达式解释字符序列数据。他们不知道数字,只知道单个数字(及其常规组合)。尽管在您的特定情况下,围绕此限制有一个简单的解决方法,但最终是需求不匹配。
除非有很好的理由在grep
这里使用(例如,因为您已经对其进行了测量,并且效率大大提高,并且效率对您而言至关重要),否则我建议您使用其他工具。
awk
,例如,可以基于数值比较进行过滤,例如:
awk '$1 == 0' your_file
而且,要获得所有包含大于零的数字的行:
awk '$1 > 0' your_file
我喜欢regex,这是个很棒的工具。但这不是唯一的工具。俗话说,如果只有grep
,一切看起来就像是普通语言。
printf '0\n1\n-1\na\nb\n0\n0 also\n0.0\n-0.0\n0*0\n' | awk '($1 == 0)'
将匹配:0
,0.0
和-0.0
...也0 also
!不只是“ 0”。(有时需要,有时则不需要)。如果用户只需要“ 0” :(awk '/^0$/'
或grep '^0$'
)。您还应该编辑:用户需要添加!
否定测试,以便隐藏0
(和其他零)并显示其余部分。即:awk '!( $0 == 0)'
$1 == "0"
>
而不是!=
(或等效地! (… == …)
)来强调这是一个任意的数值比较,而不仅仅是相等。至于您的其他评论,这是完全正确的,但随后我们基本上回到了字符串比较领域和使用grep
工作的现有解决方案(尽管awk
当然也可以工作)。
$0=="0"
当您要删除的行仅包含一个0
后跟下一行时,您可以通过发出以下命令来选择这些行:
grep -v "^0$"
这将只打印的出现0
是在一行的末尾,并在一行的开头在同一时间。-v
然后,该选项会反转我们的选择。
-v
,所以它不起作用。
-v
选项有误读,谢谢!
grep -v "\b0\b"
grep -v "^0$"
-w有效,但是在您的情况下0.2是两个单词,因为点字符是一个单词分隔符。
grep -v "\b0\b"
在这里真的不工作。您使用什么版本的grep?
grep (BSD grep) 2.5.1-FreeBSD
在Mac OS和grep (GNU grep) 2.16
Ubuntu上
\<
和\>
作为单词边界,但效果与-w