gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:50 25 4
gpt4 key购买 nike

我正在尝试对第一列中具有共享 substring 的行的数据框各行的值求和。数据如下所示:

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}' 文件名 | awk -F'_' '{print $1}'

如果第一列中的值是共享的,另一个对列值求和:

awk '{a[$1]+=$2;b[$1]+=$3;c[$1]+=$4;d[$1]+=$5} END {for (i in a) 打印i, a[i], b[i], c[i], d[i]}' 文件名

但是,我正在努力组合这两个命令来创建一个新的数据框,其中包含共享 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

关于linux - 如何使用 bash 对第一列中具有共享子字符串的项目的列值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028578/

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