将多重集合转换为列表集合,求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 } }'
执行逻辑:
sort input.txt:先对输入文件内容排序,确保同bag的条目集中,同时让物品按字母序排列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
相关产品推荐
相关产品推荐

