将所有以每个名称的前两位数相同的数字相加

时间:2018-03-23 14:20:58

标签: bash awk sed

我正在尝试编写一个脚本来汇总所有数字(第2列)以相同的前两位数字(第1列)开头,然后用相同的前两位数字保存它们然后为零(即1001将为1000,96542将是96000)。例如;

ele  table  5
        1001.03c  1
        1002.03c  2
        1003.03c  1
        2003.03c  3
        2004.03c  1
        3006.03c  0
        3007.03c  5
       44009.03c  1
ele table  22  
        1001.03c  1
        1002.03c  0
        1003.03c  0.2
        2003.03c  1
        2004.03c  2
        3006.03c  2.2
        3007.03c  3
       44009.03c  0
       55010.03c  2

因此,我们的想法是获取具有以下输出的输出文件:

    ele  table  5
        1000.03c  4
        2000.03c  4
        3000.03c  5
       44000.03c  1
ele table  22  
        1000.03c  1.2
        2000.03c  3
        3000.03c  5.2
        4000.03c  0
       55000.03c  2

该列表适用于长文件。我会感激任何帮助。

1 个答案:

答案 0 :(得分:0)

Awk 解决方案:

awk 'function pr(){ 
         printf "\t%d%0*d%s  %s\n", k, len-6, "", fr, sum; sum = 0;  
     }
     /^ele +table/{
         if (k) pr();
         print; next
     }
     k && substr($1, 1, 2) != k{ pr() }
     { 
         k = substr($1, 1, 2); 
         len = length($1);
         fr = substr($1, index($1, "."));
         sum += $2 
     }
     END{ pr() }' file

输出:

ele  table  5
    1000.03c  4
    2000.03c  4
    3000.03c  5
    44000.03c  1
ele table  22  
    44000.03c  0
    1000.03c  1.2
    2000.03c  3
    3000.03c  5.2
    44000.03c  0
    55000.03c  2