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

将多重集合转换为列表集合,求Shell脚本替代Python的实现方案

Shell脚本实现文本分组归类

现有纯文本文件(假设名为input.txt)内容如下:

bag1: apple
bag3: pear
bag2: potato
bag2: orange
bag1: banana
bag2: banana
onion

需要转换为以下格式:

bag1: [apple, banana]
bag2: [banana, orange, potato]
bag3: [pear]
non-categorized: onion

可以通过sort搭配awk实现这个需求,以下是两种可行的Shell命令方案:

方案1:基础分组(bag顺序按首次出现排序)

sort input.txt | awk '
BEGIN {
    FS = ": "
}
/:/ {
    key = $1
    val = $2
    map[key] = (key in map) ? map[key] ", " val : val
    next
}
{
    non_categorized = $0
}
END {
    for (bag in map) {
        print bag ": [" map[bag] "]"
    }
    if (non_categorized != "") {
        print "non-categorized: " non_categorized
    }
}'

执行逻辑:

  1. sort input.txt:先对输入文件内容排序,确保同bag的条目集中,同时让物品按字母序排列
  2. awk处理部分:
    • 初始化字段分隔符为: ,方便拆分bag名称和物品
    • 匹配包含: 的行,提取bag名称和物品,存入关联数组map,相同bag的物品用, 拼接
    • 不包含: 的行(无归类的条目)存入变量non_categorized
    • 最后遍历数组输出每个bag的结果,再输出未归类内容

方案2:按bag名称排序输出

如果需要bag按bag1、bag2、bag3的顺序输出,可以调整awk逻辑,对bag键进行排序:

sort input.txt | awk '
BEGIN {
    FS = ": "
}
/:/ {
    key = $1
    val = $2
    map[key] = (key in map) ? map[key] ", " val : val
    if (!(key in seen)) {
        keys[++count] = key
        seen[key] = 1
    }
    next
}
{
    non_categorized = $0
}
END {
    asort(keys)
    for (i = 1; i <= count; i++) {
        bag = keys[i]
        print bag ": [" map[bag] "]"
    }
    if (non_categorized != "") {
        print "non-categorized: " non_categorized
    }
}'

额外逻辑:

  • 新增数组keys记录所有bag名称,seen数组避免重复添加
  • 用asort(keys)对bag名称排序,保证输出顺序规整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:05:26