【问题标题】:bash script count each lines and some fieldsbash脚本计算每一行和一些字段
【发布时间】:2014-10-23 19:07:55
【问题描述】:

我需要计算来自每个提供商的每个连接 ,连接在第一列最后一个提供者,最终输出必须是每个运算符的总和

15 48502416383, orange:
2 48502416400, orange:
1 48601130989, plus:
3 48601131238, plus:
1 48782988324, plus:
4 48500182073, orange:
4 48694480239, era:
7 48697044484, orange:
4 48783915134, orange:
5 48512807390, orange:
11 48602570756, era:
12 48504126777, orange:
12 48507000833, orange:
18 48604089990, era:
19 48607629812, orange:
19 48880458754, era:
20 48515114454, orange:
29 48604089930, era:
31 48602240259, era:
37 48605110152, plus:
50 48608646173, era:
74 48783937132, era:

应该是这样的

plus 42
orange 100
era 236

【问题讨论】:

  • 你尝试过什么吗?你在哪里卡住了?

标签: bash shell awk


【解决方案1】:

awk 喜欢这些东西:

awk '{a[$3]+=$1} END {for (i in a) print i, a[i]}' file

返回:

orange: 100
plus: 42
era: 236

这会将总和存储在数组a[] 中,即索引的第三列。一旦文件被完全处理,在END 块中,它会循环遍历数组并打印结果。


要去掉冒号:,可以使用(感谢Cyrus for the recommendation):

awk -F"[ :]" '{a[$3]+=$1} END {for (i in a) print i, a[i]}' a

返回:

plus 42
orange 100
era 236

-F"[ :]" 表示字段分隔符可以是空格(默认)或冒号。这样,第 3 列将只是 orange,而不是 orange:。

【讨论】:

  • 考虑添加-F '[ :]'
  • 真的!好一个。我发现只有空格很方便,这样输出就会显示冒号并使其显示得更好。已更新,谢谢!
  • 它改变了输出顺序——但我不知道为什么。我已经更新了你的答案。
  • @Cyrus 这是因为for (i in a)。请参阅Why does awk seem to randomize the array? 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2017-11-28
相关资源
最近更新 更多