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

