我需要按行计算值 < 5 的列数。我的数据如下所示:
1.2 8.9 4.5 2.8
4.9 10.1 15.3 1.1
2.1 4.3 3.9 3.3
.
.
所以想要的输出是这样的:
3
2
4
答案1
每条记录的字段数(默认情况下每行以空格分隔的列)为NF
。您可以使用 循环遍历记录中的所有字段for (i = 1; i <= NF; ++i)
。字段中的数据将在循环内部i
可用。$i
例如:
awk '{ count = 0; for (i = 1; i <= NF; ++i) if ($i < 5) ++count; print count }'
或者,更详细地写出来,
awk '
{
count = 0
for (i = 1; i <= NF; ++i)
if ($i < 5)
++count
print count
}'
if
由于and语句的主体for
只是一个语句,因此不需要额外的换行{ ... }
(与 C 编程语言一样,但与 Perl 不同)。除非要将同一行上的一个语句与另一个语句分开(例如,;
比较上面两个等效代码片段中的使用),否则不需要行末尾的。;
答案2
另一种方法是使用 Perl:
perl -alpe '$_ = grep { $_ < 5 } @F' file
grep 结果的标量赋值将其转换为匹配元素的计数。
答案3
运行输入tr
并将所有破折号转换为下划线,用于通过以下方式识别负数dc
:
$ tr \- _ < inp.txt |
dc -e '
[q]sq
[lN1+sN]sa
[5>az0<b]sb
[?z0=q0sNlbxlNpcz0=c]sc
lcx
'