You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX环境下对重复前缀字符串末尾数值求和的脚本方案

解决方案:用sort+awk实现前缀分组求和

这是典型的按字符串前缀分组、对末尾数值求和的场景,结合你提到的sort命令,搭配awk就能高效完成需求,下面是具体实现:

核心命令

先通过sort确保相同前缀的行连续(虽然awk的数组可以全局累加,但排序后能让处理逻辑更直观,也能避免极端场景下的性能问题),再用awk拆分每行并聚合求和:

sort your_input_file.txt | awk -F',' '{
    # 提取前缀:去掉行末尾的",数字"部分
    prefix = $0
    sub(/,[0-9]+$/, "", prefix)
    # 累加对应前缀的数值
    sum[prefix] += $NF
}
END {
    # 遍历输出所有前缀和对应的总和
    for (key in sum) {
        print key "," sum[key]
    }
}'

命令详解

  1. sort your_input_file.txt:将文件内容排序,让相同前缀的行集中在一起,方便后续聚合处理。
  2. awk -F',':指定awk的字段分隔符为逗号,这样每行会被拆分成多个字段,最后一个字段$NF就是我们要求和的数值。
  3. 提取前缀:用sub(/,[0-9]+$/, "", prefix)正则替换,去掉行末尾的逗号和数字部分,剩下的就是我们用来分组的前缀字符串。这个正则的意思是:匹配行尾($)的逗号+一个或多个数字([0-9]+),并替换为空。
  4. 累加求和:用sum[prefix] += $NF将当前行的数值累加到对应前缀的总和数组中。
  5. 输出结果:在END块中遍历sum数组,输出每个前缀和对应的总和,用逗号连接。

测试示例

针对你给出的输入:

a,b,c,d,e,5
a,b,c,d,4
a,b,c,d,e,10

运行命令后会输出:

a,b,c,d,e,15
a,b,c,d,4

完全符合你的需求。

另一种构建前缀的方式(循环拼接)

如果你担心正则可能出现的意外匹配(比如前缀里有类似,数字的结尾,但实际这种情况符合你的输入规则,不会出现),也可以用循环拼接前缀字段:

sort your_input_file.txt | awk -F',' '{
    key = ""
    # 拼接第1到倒数第2个字段
    for (i=1; i<NF; i++) {
        key = key $i (i < NF-1 ? "," : "")
    }
    sum[key] += $NF
}
END {
    for (key in sum) print key "," sum[key]
}'

这种方式更稳妥,逐个字段拼接前缀,适合对正则不太熟悉的场景。

内容的提问来源于stack exchange,提问作者TTaJTa4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:27:28