Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 解析csv文件并按特定公式计算相同的数据_Linux_Bash_Csv - Fatal编程技术网

Linux 解析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

我的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,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