groupby/对第一列中的所有列求和相同的awk
我有一个文件,其中有n列(不知道有多少列提前)。我需要对具有相同column1值的列求和并打印它们。除第一列外,所有列均为数字。比如说 file1.txtgroupby/对第一列中的所有列求和相同的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 ...
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