groupby/对第一列中的所有列求和相同的awk

groupby/对第一列中的所有列求和相同的awk,awk,Awk,我有一个文件,其中有n列(不知道有多少列提前)。我需要对具有相同column1值的列求和并打印它们。除第一列外,所有列均为数字。比如说 file1.txt col1 col2 col3 ... colN val1 3000 1000 ... 5000 val2 3000 1000 ... 5000 val1 1000 2000 ... 3000 预期产出: col1 col2 col3 ... colN val1 4000 3000 ... 8000 val2 3000 1000 ...

我有一个文件,其中有n列(不知道有多少列提前)。我需要对具有相同column1值的列求和并打印它们。除第一列外,所有列均为数字。比如说

file1.txt

col1 col2 col3 ... colN
val1 3000 1000 ... 5000 
val2 3000 1000 ... 5000
val1 1000 2000 ... 3000
预期产出:

col1 col2 col3 ... colN
val1 4000 3000 ... 8000 
val2 3000 1000 ... 5000
我试过:

awk '{sums[$1] += $2} END { for (i in sums) printf("%s %s\n", i, sums[i])}' file1.txt | sort 
这只打印前两列。我需要添加并打印所有列。

这应该可以:

awk 'NR==1{print;next}
    {b[$1];for(i=2;i<=NF;i++)a[$1,i]+=$i}
    END{for(x in b){
            printf "%s ",x;
            for(i=2;i<=NF;i++)
                printf "%s" (i==NF?"\n":" "),a[x,i]}}' file
awk'NR==1{print;next}

{b[$1];对于(i=2;i使用awk by
数组的数组
,如果您的GNU awk高于版本4.1

awk 'NR==1{print;next}
{for (i=2;i<=NF;i++) a[$1][i]+=$i}
END { for (i in a) 
        {  printf i
          for (j=2;j<=length(a[i])+1;j++) 
              printf FS a[i][j]
          printf RS
        }
    }' file 
awk'NR==1{print;next}

{for(i=2;在我看来这是一个正确的想法,但您需要在每个字段上循环,并对每个字段进行求和。您可以使用
求和[$1,i]
(假设您的循环变量为i)根据
$1
的值和字段号创建数组索引。然后,您的结束循环必须从1走到X(在某个点保存NF,并假设所有行的长度相同)并打印出顺序字段。感谢Kent,它在结果文件中使用了一些意外的格式。值为“4271387753”的列将被格式化为“4.27139e+10”。我想保留列值的原样,如果它们未被触及。有什么想法吗?嗨,肯特,谢谢!!我通过放置%d而不是%s来更正格式。感谢您的帮助。
printf“%s”(I==NF?”\n:“,[x,I]
是非常奇怪的语法。为什么不
printf“%s%s”,a[x,I],(I==NF?”\n:“)
?这更清楚,因为分隔符字符跟在脚本中的数据后面,就像它在输出中一样,并且您明确/明确地使用了printf格式字符串。我实际使用的是
printf“%s%s”,a[x,I],(i@EdMorton谢谢。是的,你是对的。当我再次阅读代码时,我也感到奇怪。我想我得到的原因是,首先测试没有那些格式的东西,然后检查输出,哦,我需要一些东西,只要把奇怪的东西放在那里……(
%s
变体是明智的方式。
awk 'NR==1{print;next}
{for (i=2;i<=NF;i++) a[$1][i]+=$i}
END { for (i in a) 
        {  printf i
          for (j=2;j<=length(a[i])+1;j++) 
              printf FS a[i][j]
          printf RS
        }
    }' file