bash – 使用非连续索引查找关联数组中的重复元素
发布时间:2020-12-15 22:02:27 所属栏目:安全 来源:网络整理
导读:我一般都是从bash和代码开始编写这个有很多痛苦,任何人都可以告诉我它是否适用于每种情况,也许有人有更好的方法? 提前谢谢了. array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 )KEYS=(${!array[@]})for i in "${!KEYS[@]}"; do for j in "${!KEYS[@]}
我一般都是从bash和代码开始编写这个有很多痛苦,任何人都可以告诉我它是否适用于每种情况,也许有人有更好的方法?
提前谢谢了. array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 ) KEYS=(${!array[@]}) for i in "${!KEYS[@]}"; do for j in "${!KEYS[@]}"; do if [[ $i -eq $j ]]; then continue fi if [[ ${array[${KEYS[$i]}]} -eq ${array[${KEYS[$j]}]} ]]; then duplicate+=( ${KEYS[$j]} ) fi done done uniq=($(printf "%sn" "${duplicate[@]}" | sort -u)); echo "${uniq[@]}" 编辑: 我的预期输出是一个包含重复元素索引的数组. 解决方法
这种方法具有线性复杂度(假设恒定时间数组查找)而不是级联循环的二次复杂度:
array=( [0]=24 [1]=24 [5]=10 [6]=24 [10]=24 [12]=12 ) ref=( ) for i in "${!array[@]}"; do ref[array[i]]="${ref[array[i]]}$i " done for i in "${!ref[@]}"; do [[ "${ref[i]% }" == *" "* ]] && echo "$i @ ${ref[i]% }" done 第一个循环将数据从array []复制到ref [],切换键和值的角色,并在发生冲突时连接新值(各个条目之间有空白).因此,在第一个循环之后,ref []将具有以下内容: ref=( [10]="5 " [12]="12 " [24]="0 1 6 10 " ) 第二个循环打印来自ref []的条目,但跳过所有不包含空白的条目,不计算尾随空白,因此只打印那些指向array []中两个或更多条目的条目. 编辑:使用Adrian在评论中建议的稍微简单的版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |