Linux新手求助:仅用Bash实现文本文件分组求和及多输出需求
嘿,别害羞!作为纯新手能摸到分组求和这一步已经很棒啦😉 先把你的tst.txt内容理清楚,它其实是按「类别 名称 数量」的三元组重复排列的:
fruit apple 2 fruit orange 1 veg carrot 4 veg chilli 3 fruit apple 1 fruit orange 2
下面给你搞定三种不同需求的Bash实现,都是用最基础的工具,不用额外安装软件:
第一种输出:所有水果和蔬菜的唯一出现情况(去重后的类别+名称)
这个需求就是把所有不重复的「类别-名称」对列出来,用awk+sort就能轻松实现:
awk '{for(i=1;i<=NF;i+=3) print $i, $(i+1)}' tst.txt | sort -u
简单解释下:
for(i=1;i<=NF;i+=3):因为每3个字段是一组,所以从第1个字段开始,每次跳3个,遍历所有分组print $i, $(i+1):打印每组的类别(第i个字段)和名称(第i+1个字段)sort -u:排序并自动去重,得到唯一的条目
运行后输出:
fruit apple fruit orange veg carrot veg chilli
第二种输出:按「名称」分组求和(忽略类别,统计每个名称的总数量)
如果要把同一个名称的数量全部加起来,不管它属于水果还是蔬菜,用这个命令:
awk '{for(i=1;i<=NF;i+=3) arr[$(i+1)] += $(i+2)} END{for(k in arr) print k, arr[k]}' tst.txt | sort
解释:
- 遍历每个三元组,把名称作为数组
arr的键,对应的数量累加到值里 END块会在处理完所有内容后执行,遍历数组打印每个名称和总数量- 最后加
sort是为了让输出更整齐(awk数组的遍历顺序不固定)
输出结果:
apple 3 carrot 4 chilli 3 orange 3
第三种输出:按「类别+名称」分组求和(细分到每个类别下的名称统计)
如果需要分别统计每个类别下每个名称的总数量,这个命令最实用:
awk '{for(i=1;i<=NF;i+=3) arr[$i" "$(i+1)] += $(i+2)} END{for(k in arr) print k, arr[k]}' tst.txt | sort
解释:
- 把「类别+空格+名称」作为数组的键,这样就能区分不同类别下的同名条目(比如如果有
veg apple也不会和fruit apple混淆) - 同样在
END块打印结果并排序
输出结果:
fruit apple 3 fruit orange 3 veg carrot 4 veg chilli 3
要是你还有更具体的格式要求(比如对齐、指定排序方式),随时说~
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

