Linux 解析csv文件并按特定公式计算相同的数据
我的CSV文件包含:Linux 解析csv文件并按特定公式计算相同的数据,linux,bash,csv,Linux,Bash,Csv,我的CSV文件包含: block_num,date_time,miner_wallet,rewards,finished,verified 133,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,7,6 134,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,2,2 135,2019-02,0xd1dacf164f4bed77c37a26a79e9d63606cc35c82
block_num,date_time,miner_wallet,rewards,finished,verified
133,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,7,6
134,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,2,2
135,2019-02,0xd1dacf164f4bed77c37a26a79e9d63606cc35c82,0.0,7,6
135,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,7,7
136,2019-02,0x212eccf2cccdecb1880e058ec40b21dd36f47c85,0.0,3,3
136,2019-02,0xd1dacf164f4bed77c37a26a79e9d63606cc35c82,0.0,4,4
137,2019-02,0xa57d8b10d0186abf946f9b6a2709c680970fdd39,0.0,1,1
我需要将每个相同的“miner_钱包”计算为一个输出,其中包含miner地址和最后一个字段“已验证”的总和,并乘以4,因此的输出为:
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
使用bash、awk或任何简单的方法…使用
awk
非常容易。假设文件中的第一行是显示的需要跳过的标题行,则可以执行以下操作:
$ awk -F, '{ if (NR == 1) next; w[$3] += $6 * 4}
END { for (i in w) print i, w[i]}' file
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40
解释
将字段分隔符设置为awk-F,
,'
如果行号为{if(NR==1)next;
跳到下一行以跳过标题1
设置关联数组w[$3]+=$6*4}
w[miner\u wallet]=verified*4
输出数组索引和总值END{for(i in w)print i,w[i]}
其中,
FS
是字段分隔符,map
是一个哈希映射,用于保存每个钱包的总和,NR>1
跳过带有标题的第一行 “或者任何简单的方法…”->其中将是ipcsv data.csv | group miner | u wallet |选择名称,@{n='check';e={($uu.group | measure verified-sum).sum*4}}| epcsv out.csv-notype
这两个答案基本相同。唯一的区别是变量名,它们在哪里初始化,在哪里对NR
进行检查awk
是一个很棒的工具。很值得学习。。
awk 'BEGIN{FS=","} NR>1 {map[$3]+=$6;} END{for (key in map) {print key " " map[key] * 4;}}' i.csv
0x212eccf2cccdecb1880e058ec40b21dd36f47c85 72
0xa57d8b10d0186abf946f9b6a2709c680970fdd39 4
0xd1dacf164f4bed77c37a26a79e9d63606cc35c82 40