首页 > 解决方案 > Bash:根据键对一列中的值求和

问题描述

我有具有以下结构的日志文件:

DATE:AMZN:209:159.99
DATE:AMZN:300:159.99
DATE:GOOGL:75:552.03
DATE:GOOGL:300:1091.50
DATE:GOOGL:100:199.99
DATE:TSLA:19:9019.99

我想要做的是计算可以在日志文件中找到的每家公司(2.列)的总数量(3.列)。因此,这种情况下的结果应该是:

AMZN:509
GOOGL:475
TSLA:19

我尝试使用awkand sort,尽管我对这些实用程序没有太多经验。如果您有任何建议,请在下面发布。

标签: bashawk

解决方案


awksort:_

awk 'BEGIN{FS=OFS=":"} {a[$2]+=$3} END{for(i in a){print i OFS a[i]}}' file | sort

有 GNUawk和没有sort

awk 'BEGIN{FS=OFS=":"}{a[$2]+=$3}END{PROCINFO["sorted_in"] = "@val_str_desc"; for(i in a)print i FS a[i]}' file

输出:

亚马逊:509
谷歌:475
特斯拉:19

请参阅:8 个强大的 Awk 内置变量——FSOFS、RS、ORS、NR、NF、FILENAME、FNR


推荐阅读