gpt4 book ai didi

bash - 如何使用 awk 在多列 .tsv 文件中按第一列值聚合(求和)行?

转载 作者:行者123 更新时间:2023-11-29 09:29:33 25 4
gpt4 key购买 nike

那里有几个示例,但总是针对只有一列要聚合的文件,例如

awk '{arr[$1]+=$2;} END {for (i in arr) print i, arr[i]}' filename

除了具有数百列的文件外,我该如何执行相同的操作?输出也应该是那数百列。

输入

a 1 2 4 1 ...
b 1 2 1 2 ...
b 2 1 1 1 ...

输出

a 1 2 4 1 ...
b 3 3 2 3 ...

最佳答案

使用 如下:

awk '{                                 # Call awk
b[$1]; # array b with index being first field

for(i=2;i<=NF;i++) # loop from 2nd field to last field, NF gives total no of fields in record/line
a[$1,i]+=$i # array a where index being first field SUBSEP and current value of i
# $i gives current field value,
# using += value will be summed whenever it encounters with same array index

}

END{ # end block here we process
for( i in b) # loop through array b
{
printf("%s",i) # print index value which forms 1st column
for(j=2;j<=NF;j++) # loop through 2nd field to last field
{
printf("%s%s",OFS,a[i,j]) # print o/p sep and array element
}
print ""; # print new line
}
}' file

一行

awk '{ b[$1]; for(i=2;i<=NF;i++)a[$1,i]+=$i }END{for( i in b){printf("%s",i);for(j=2;j<=NF;j++){printf("%s%s",OFS,a[i,j])} print ""}}' file

输入

akshay@db-3325:/tmp$ cat file
a 1 2 4 1
b 1 2 1 2
b 2 1 1 1

输出

akshay@db-3325:/tmp$ awk '{ 
b[$1];
for(i=2;i<=NF;i++)
a[$1,i]+=$i
}
END{
for( i in b)
{
printf("%s",i)
for(j=2;j<=NF;j++)
{
printf("%s%s",OFS,a[i,j])
}
print "";
}
}' file
a 1 2 4 1
b 3 3 2 3

如果您的文件的第一个字段已排序,则

awk '
function print_and_clear(i,j)
{
for( i in b)
{
printf("%s",i)
for(j=2;j<=NF;j++)
{
printf("%s%s",OFS,a[i,j])
}
print "";
}
split("",a)
split("",b)
}
p!=$1{
if(i){
print_and_clear()
}
p = $1
}
{
b[$1]
for(i=2; i<=NF; i++)
a[$1,i]+=$i
}
END{
print_and_clear()
}
' file

关于bash - 如何使用 awk 在多列 .tsv 文件中按第一列值聚合(求和)行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42557644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com