【问题标题】:How to count the number of data with specific conditions from columns using awk?如何使用awk计算列中具有特定条件的数据数?
【发布时间】:2015-10-16 10:38:53
【问题描述】:

我有一个如下格式的数据文件

AA 21.1218 14.7862 0.0566269
BB 26.5036 14.5513 19.975
CC 7.82448 1.30605 50.126899
AA 10.0179 4.3786 21.232036
BB 4.80236 4.23255 36.217038
CC 31.475 9.60365 7.237505
AA 8.39392 5.89571 10.30242
......

在这里,我想做的是

检查第 1 列和第 4 列,计算第 4 列中大于 12 的数据的个数,以及第 1 列中的 'BB',(上例中应为 2),然后乘以 20那个号码。 (最终答案应该是40)

我是从

awk '{print ($4>12)}' file > file2
wc -l file2

检查第 4 列的编号,并打印行号。

但显然他们没有奏效。似乎 awk 不能在里面使用 运算符。 (大于或小于)如何使用 cat、awk、sed 或 grep 实现此操作?

谢谢

【问题讨论】:

  • @Ed Morton 我的意思是“大于”或“小于”
  • @Ed Morton 但我只能在文件中看到 0 和 1...也许我的方法是错误的...
  • 啊,我明白了,谢谢。我正在再次阅读 awk 的手册
  • 要真正学习 awk,请阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。
  • 感谢您的推荐。我登录亚马逊。 :)

标签: bash awk sed


【解决方案1】:

打印匹配行:

awk '$1 == "BB" && $4 > 12' file

(执行隐式动作{print}

你也可以算数和乘法:

awk 'BEGIN {count = 0} $1 == "BB" && $4 > 12 {count++} END {print(count * 20)}' file

【讨论】:

  • 谢谢。这很简单但很完美。如果我使用 awk if 语句,它会比你的方法更快吗?
  • @exsonic01 你的意思是像awk '{if ($1 == "BB" && $4 > 12) print}' ?我认为不会有任何区别,但我不确定。
  • 是的,有时我的文件非常大,所以我只是好奇哪个会更快,但我可以自己测试。谢谢
  • 您不需要将数字 awk 变量初始化为零,因此您根本不需要 BEGIN 部分。您也不需要 print 正在打印的表达式周围的括号。
  • 恕我直言,沿着这条路走下去的恶魔在于指定其他不需要明确编写的东西,如FS=" "RS="\n" 等,但如果它适合你的话......跨度>
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 2022-01-22
  • 2019-01-23
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多