数组重复值统计:按值输出出现次数及对应位置
Bash数组value重复统计解决方案
问题说明
现有一个由value,location对构成的Bash数组:
arr=(test,meta my,amazon test,amazon this,meta test,google my,google hello,microsoft)
需求是统计每个value的出现次数,并列出其对应的所有location,预期输出:
3 test: meta, amazon, google 2 my: amazon, google 1 this: meta 1 hello: microsoft
现有代码要么只保留每个value的首个location,要么把value,location作为整体统计,均无法满足需求。
实现代码
#!/bin/bash arr=(test,meta my,amazon test,amazon this,meta test,google my,google hello,microsoft) # 声明关联数组:count存次数,loc_list存对应位置列表 declare -A count loc_list # 遍历数组元素,拆分并统计 for item in "${arr[@]}"; do IFS=, read -r val loc <<< "$item" ((count[$val]++)) # 构建位置列表 [[ -n "${loc_list[$val]}" ]] && loc_list[$val]="${loc_list[$val]}, " loc_list[$val]+="$loc" done # 按次数降序输出结果 for val in "${!count[@]}"; do echo "${count[$val]} $val: ${loc_list[$val]}" done | sort -rn
关键逻辑说明
- 关联数组使用:用
declare -A声明两个关联数组,分别存储每个value的出现次数和对应的location集合,解决了普通数组无法用字符串作为键的问题。 - 元素拆分:通过
IFS=, read将每个value,location元素拆分成独立的变量,实现value和location的分离。 - 位置列表构建:首次遇到value时直接赋值location,后续遇到时追加新的location并添加分隔符,保证格式统一。
- 排序输出:最后通过
sort -rn按次数从高到低排序,匹配预期的输出顺序。
内容的提问来源于stack exchange,提问作者martyzee
相关产品推荐
相关产品推荐

