使用awk计算等于特定值的行数

  • 本文关键字:于特定 awk 计算 使用 awk
  • 更新时间 :
  • 英文 :


我有一个大约有12列的文件。我想找出第3列中不以#N/A开头的行的总数。

列3看起来像这样,大约有1000行长:

Data_3
-0.792363849
-1.036163943
-0.98661685
-1.156351406
-0.800122982
-1.079449157
#N/A
1.612877252
1.638385406

所以对于上面的例子,输出应该是8。我可以先计算有多少行以#N/A开头,然后从总行数中减去。我试过下面的命令,效果很好。但是,有没有一种更简单的方法来计算不包括#NA的行数。我该如何修改awk脚本。

awk '($3 == "#N/A") {count++} END {print count}' file

提前谢谢。

您可以将==替换为!=计数不包含#N/A 的行

idk关于更简单但最明显的两种稳健的方法是:

awk '(NR > 1) && ($3 == "#N/A") {count++} END {print (count ? (NR-1) - count : 0)}' file
awk '(NR > 1) && ($3 != "#N/A") {count++} END {print count+0}' file

两个脚本中的数学运算都是为了容纳可能为空的文件,并确保跳过标题行。

我在上面假设,根据您提供的代码,当您在问题中说start with #N/A时,您实际上是指are equal to #N/A。如果您确实是指start with #N/A,则将== "#N/A"更改为~ /^#N/A/,将!= "#N/A"更改为!~ /^#N/A/

计算有多少行以#N/A开头,然后从总行数。

如果您想在当前代码中实现这种行为,并且总是有1行标题,请执行

awk '($3 == "#N/A") {count++} END {print NR-1-count}' file

其中-1表示标题行,NR是内置变量,行数,在END中是最后处理的行数(即处理的总行数)。如果你想了解更多信息,请阅读8个强大的Awk内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

这里有一个没有awk:的解决方案

cut -f3 file | tail -n +2 | grep -cv '#N/A'

带有选项-f3的命令cut剪切第三列,默认情况下以TAB分隔
tail -n +2:从第2行开始打印。

这里,grep使用以下选项:
-v:打印不匹配的行
-c:打印匹配行数。

最新更新