我有一个这样的文件,它是制表符分隔的:
name v1 v2 v3 v4
g1 4.5 2.3 2.1 0.2
g2 10 3 5 2.3
g3 7 2.5 2.8 3.9
只是在我有 5 列和 4 行(包括标题)的虚拟文件上方向您展示。我想过滤掉这些行,如果特定行中的每一列的值> = 2,则保留该行,否则将其删除。输出应如下所示:
name v1 v2 v3 v4
g2 10 3 5 2.3
g3 7 2.5 2.8 3.9
我怎样才能使用 awk 做到这一点?
AFAIK awk 没有办法做到这一点,除非明确地迭代字段。例如:
steeldriver 已经提供了一个 awk 解决方案。这是一个 perl 版本(使用数组切片而不是 for 循环):
这仅打印第一(标题)行和所有数字字段的值大于或等于 2 的行。(非数字字段,如
g1
org2
将评估为0
)注意:perl 的功能在概念上类似,但与命令行程序
grep()
并不完全相同。grep
grep(expression,array)
对数组的每个元素(例如 )运行其第一个参数(例如 )中的表达式,$_ >= 2
并返回一个由结果为真的每个元素组成的数组。@F
在标量上下文中(例如与整数进行数值比较),它返回表达式为真的次数,而不是数组。这就是我们在这里所做的
== $#F
,以测试与$#F
(数组中的元素数@F
)的等价性该表达式可以是本例中使用的简单测试,也可以是包含任何 perl 代码的代码块。它还可以选择性地修改每个元素。例如
@new = grep(s/foo/bar/g, @old)
,将使用@old 中成功修改的所有元素填充@new(即包含至少一个“foo”的主机。所有这些都更改为“bar”)。详情请参阅perldoc -f grep
。