如何使用 bash 对第一列中具有共享子字符串的项目的列值求和



我正在尝试对第一列中具有共享子字符串的行的数据帧行之间的值求和。数据如下所示:

ID Data_1 Data_2 Data_3 Data_4 
SRW8002300_T01 1 2 3 4
SRW8002300_T02 1 2 3 4
SRW8002300_T03 1 2 3 4
SRW8004500_T01 1 2 3 4
SRW8004500_T02 1 2 3 4
SRW8006000_T01 1 2 3 4

我想在共享 ID 的第一部分(下划线之前的部分)时对第 2 到 5 列值求和。所以上面会变成:

ID Data_1 Data_2 Data_3 Data_4 
SRW8002300 3 6 9 12
SRW8004500 2 4 6 8
SRW8006000 1 2 3 4

到目前为止,我有一个awk命令,可以在下划线后剥离字符串的ID:

awk '{print $1}' filename | awk -F'_' '{print $1}'

另一个用于对列值求和(如果第一列中的值是共享的):

awk '{a[$1]+=$2;b[$1]+=$3;c[$1]+=$4;d[$1]+=$5} END {for (i in a) print i, a[i], b[i], c[i], d[i]}' filename

但是,我正在努力将这两个命令结合起来,以创建一个具有共享 ID 求和值的新数据帧。

我通常用python编写代码,但我试图养成为这类任务编写bash脚本的习惯。

感谢您的任何帮助。

假设您的键值是连续的,如示例输入所示:

$ cat tst.awk
NR==1 { print; next }
{
curr = $1
sub(/_.*/,"",curr)
if ( curr != prev ) {
prt()
}
for (i=2; i<=NF; i++) {
sum[i] += $i
}
prev = curr
}
END { prt() }
function prt() {
if ( prev != "" ) {
printf "%s%s", prev, OFS
for (i=2; i<=NF; i++) {
printf "%d%s", sum[i], (i<NF ? OFS : ORS)
}
delete sum
}
}
$ awk -f tst.awk file
ID Data_1 Data_2 Data_3 Data_4
SRW8002300 3 6 9 12
SRW8004500 2 4 6 8
SRW8006000 1 2 3 4

最新更新