使用Shell添加列值

时间:2017-11-04 16:15:11

标签: shell awk grep

我的输入文件如下所示。

pmx . pmnosysrelspeechneighbr -m 1 -r

INFO: The ROP files contain  suspected faulty counter values.
They have been discarded but can be kept with pmr/pmx option "k" (pmrk/pmxk) or highlighted with pmx option "s" (pmxs)


Date: 2017-11-04
Object              Counter                  14:45  15:00  15:15  15:30
UtranCell=UE1069XA0 pmNoSysRelSpeechNeighbr      0      1      0      0
UtranCell=UE1069XA1 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XA2 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XA3 pmNoSysRelSpeechNeighbr      0      0      2      0
UtranCell=UE1069XB0 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XB1 pmNoSysRelSpeechNeighbr      0      0      0      3
UtranCell=UE1069XB2 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XB3 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XC0 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XC1 pmNoSysRelSpeechNeighbr      0      0      0      4
UtranCell=UE1069XC2 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1069XC3 pmNoSysRelSpeechNeighbr      0      0      1      0
UtranCell=UE1164XA0 pmNoSysRelSpeechNeighbr      0      3      0      0
UtranCell=UE1164XA1 pmNoSysRelSpeechNeighbr      0      0      0      0
UtranCell=UE1164XA2 pmNoSysRelSpeechNeighbr      1      0      0      0

现在我希望输出如下所示,它基本上是时间列(从$3$6)值的总和。

Counter                  14:45  15:00  15:15  15:30
pmNoSysRelSpeechNeighbr      1      4      3      7

我一直试着用下面的命令。但它只是给出一个列值的总和:

pmx . pmnosysrelspeechneighbr -m 1 -r | grep - i ^Object| awk '{sum += $4} END {print $1 , sum}'

2 个答案:

答案 0 :(得分:0)

您需要单独对每个列进行求和

awk -v g=pmNoSysRelSpeechNeighbr '$0 ~ g { for(i=3;i<=6;i++) sum[i]+=$i } 
                                  END { printf g; for(i=3;i<=6;i++) printf OFS sum[i] }' file

但仅适用于包含感兴趣的组(计数器)($0~"pmNoSysRelSpeechNeighbr")的行(记录)。

请注意,您(几乎)永远不需要将grep的输出传递给awk,因为awk已经支持使用/regex/ { action }或{{1}进行扩展正则表达式过滤}}。一个例外是需要PCRE(var ~ /regex/ { action })。

作为文本文件上简单“命令行statistical operations ”的grep -P的替代方法,您还可以使用GNU datamash

例如,要将第3列和第6列相加,但按第2列分组:

awk

答案 1 :(得分:0)

试试这个,你会得到标题和预告片作为各列的总和。

BEGIN { 
   trail="pmNoSysRelSpeechNeighbr"; 
}
{
    if($1=="Object") print $2 OFS $3 OFS $4 OFS $5 OFS $6;
    else if($1 ~ /^UtranCell/) {
        w+=$3; x+=$4; y+=$5; z+=$6;
    }
}
END {
    print trail OFS w OFS x OFS y OFS z;
}