为awk中的每一列打印行和其他行值的总和

问题描述 投票:0回答:1

我有一个结构如下的csv文件:

             |  Taiwan  |       |   US      |   
             |  ASUS    |   MSI |   DELL    |   HP
            ------------------------------------------
    CPU      |  50      |   49  |   43      |   65
    GPU      |  60      |   64  |   75      |   54
    HDD      |  75      |   70  |   65      |   46
    RAM      |  60      |   79  |   64      |   63
    assembled|  235     |   244 |   254     |   269

并且我必须使用awk脚本来打印单个计算机价格(第3至6行)的价格总和之间的比较,“对比”组装后的计算机价格(第7行),还要显示每个品牌的来源国。终端中的打印结果应类似于:

Taiwan      Asus    245     235
Taiwan      MSI     262     244
US          DELL    247     254
US          HP      228     269

第三列是CPU,GPU,HDD和RAM价格的总和,第四列是每个计算机品牌在第7行中看到的价格相同的值。

到目前为止,我已经能够汇总用于转换下面我链接的文章中提供的解决方案的各个列,但是我不知道如何以所需的格式显示想要的结果。有人可以帮我吗?此时我有点绝望。

Sum all values in each column bash

这是此消息顶部表示的原始csv文件的内容:

,Taiwan,,US,
,ASUS,MSI,DELL,HP
CPU,50,49,43,65
GPU,60,64,75,54
HDD,75,70,65,46
RAM,60,79,64,63
assembled,235,244,254,269

非常感谢。

csv awk sum multiple-columns
1个回答
2
投票
$ cat tst.awk BEGIN { FS=","; OFS="\t" } NR == 2 { for (i=2; i<=NF; i++) { corp[i] = (p[i] == "" ? p[i-1] : p[i]) OFS $i } } NR > 2 { for (i=2; i<=NF; i++) { tot[i] += p[i] } } { split($0,p) } END { for (i=2; i<=NF; i++) { print corp[i], tot[i], p[i] } }

$ awk -f tst.awk file Taiwan ASUS 245 235 Taiwan MSI 262 244 US DELL 247 254 US HP 228 269

© www.soinside.com 2019 - 2024. All rights reserved.