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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:57:07