Bash awk看到每个列的第一个字段重复

Bash awk看到每个列的第一个字段重复,bash,awk,Bash,Awk,我正在尝试使用awk命令对匹配第一个字段作为键的两列进行相加。 该文件可以包含32列或更多列。 “时间”列是固定的 带6列HDDx-U00的Ex: time,HDD0-U00,HDD1-U00,HDD2-U00,HDD0-U00,HDD1-U00,HDD2-U00 2015/10/26 16:10,1,3,5,2,4,6 2015/10/26 16:11,1,2,3,4,5,5 2015/10/26 16:12,2,2,3,6,2,3 ... more row

我正在尝试使用awk命令对匹配第一个字段作为键的两列进行相加。 该文件可以包含32列或更多列。 “时间”列是固定的

带6列HDDx-U00的Ex:

    time,HDD0-U00,HDD1-U00,HDD2-U00,HDD0-U00,HDD1-U00,HDD2-U00
    2015/10/26 16:10,1,3,5,2,4,6
    2015/10/26 16:11,1,2,3,4,5,5
    2015/10/26 16:12,2,2,3,6,2,3
  ... more row  in the file...
计算: 世界其他地区:2015/10/26 16:10:

HDD0-U00作为第一个键:(1+2)

HDD1-U00作为第二个键:(3+4)

HDD3-U00作为第三个键:(5+6)

最后,要获得此结果:

time,HDD0-U00,HDD1-U00,HDD2-U00
2015/10/26 16:10,3,7,11
2015/10/26 16:11,5,7,8
2015/10/26 16:12,8,4,6
我用awk试过这个:

awk -F, '{k=$3;seen[k];for(i=4;i<=NF;++i)sum[k,i]+=$i}' $file
awk-F'{k=$3;参见[k];for(i=4;i
$cat文件)
“编号”,“时间”,HDD0-U00,HDD1-U00,HDD2-U00,HDD0-U00,HDD1-U00,HDD2-U00
1,"2015/10/26 16:10",1,3,5,1,3,5
2,"2015/10/26 16:11",1,3,3,1,3,5
3,"2015/10/26 16:12",1,3,5,1,3,5
4,"2015/10/26 16:13",1,3,5,1,3,5
5,"2015/10/26 16:14",1,3,5,1,3,5
$awk'
#拆分$1、$2、$NF上的“,”
开始{
FS=“,”;
}
#阅读第一行以理解标题
NR==1{
对于(i=1;i,如果您的换档模式不变:


基于1,3,5,1,3,5,不确定2,6,10从何而来。最好解释一下你的逻辑。做一个简单的例子,输入/输出。没有那些
,因为我们不知道列数是否也会减少…@fedorqui:1+1=2,3+3=6,5+5=10;基于重复的头文件…(HDD0-U00等)因此,请Indi59发布一个独立的示例,并附上一个适当的解释,如@Kent建议的。我们不想发布一个答案,然后通过进一步解释这些
的含义而失效。我会给出更多解释,感谢非常好的解决方案!@Indi59我认为这个解决方案可能依赖于gawk,因为我使用了de>长度(arr)
无常量值。标头包含:HDD0-U00,…至…,HDD31-U00
$ cat file
"No.","time",HDD0-U00,HDD1-U00,HDD2-U00,HDD0-U00,HDD1-U00,HDD2-U00
1,"2015/10/26 16:10",1,3,5,1,3,5
2,"2015/10/26 16:11",1,3,3,1,3,5
3,"2015/10/26 16:12",1,3,5,1,3,5
4,"2015/10/26 16:13",1,3,5,1,3,5
5,"2015/10/26 16:14",1,3,5,1,3,5

$ awk '
    # Split $1, $2, $NF on ","
    BEGIN {
        FS=",";
    }
    # Read first line to understand the header
    NR==1 {
        for (i=1; i<=NF; i++) {
            head[i] = $i
        }
        for (i=1; i<=NF; i++) {
            sum[head[i]] = $i;
        }
        # Print header:
        printf("%s", sum[head[1]]);
        for(i=2; i <= length(sum); i++) {
            printf(",%s", sum[head[i]]);
        }
        printf("\n");
        # Skip the last part of the script:
        next;
    }
    # Read all other lines
    {
        printf("%s,%s", $1, $2);
        # Remember to clear sum for every line
        delete sum;
        # Add up all of the values
        for (i=3; i <= NF; i++){
            sum[head[i]] += $i;
        }
        for(i=1; i <= length(sum); i++) {
            printf(",%s", sum[head[i+2]]);
        }
        printf("\n");
    }
' file
awk -F\, -v shift=3 ' NR>1{printf("%s,%s",$1,$2)
          for (i=shift;i<=(NF/shift)+shift;i++){printf(",%s",$i+$(i+shift))};print ""}' file
1,"2015/10/26 16:10",2,6,10
2,"2015/10/26 16:11",2,6,10
3,"2015/10/26 16:12",2,6,10
4,"2015/10/26 16:13",2,6,10
5,"2015/10/26 16:14",2,6,10