Arrays 使用Bash在数组中查找多个副本及其索引?

Arrays 使用Bash在数组中查找多个副本及其索引?,arrays,linux,bash,Arrays,Linux,Bash,我有一个具有以下值的数组: list=("abc" "abcd" "abc" "abcde" "abcde" "abcdf" "abc") 是否有办法将重复项的索引放入另一个数组中,如: abc_position_list=(0, 2, 6) abcde_position_list=(3, 4) 我设法将所有索引放入一个数组中,但这样,您就不知道哪些索引具有相同的值 这是否可能与bash一起实现,或者python是否更合适?在python中: list_items = ["abc", "ab

我有一个具有以下值的数组:

list=("abc" "abcd" "abc" "abcde" "abcde" "abcdf" "abc")
是否有办法将重复项的索引放入另一个数组中,如:

abc_position_list=(0, 2, 6)
abcde_position_list=(3, 4)
我设法将所有索引放入一个数组中,但这样,您就不知道哪些索引具有相同的值

这是否可能与bash一起实现,或者python是否更合适?

在python中:

list_items = ["abc", "abcd", "abc", "abcde", "abcde", "abcdf", "abc"]
counters = {}

for item in list_items:
    if item not in counters:
        counters[item] = [i for i, x in enumerate(list_items) if x == item ]
print counters
  • printf“%s\n”${list[@]}
    -将数组打印为换行分隔的元素
  • nl-w1
    -为每个元素添加另一列-编号
  • sort-k2
    根据值对列表进行排序
  • uniq-f1-D
    -打印重复的元素,忽略第一列
  • 与:

    你会得到

    1   abc
    3   abc
    7   abc
    4   abcde
    5   abcde
    
    现在是创建阵列的时候了。因为您希望从列表中提取数组名,所以我想我们必须使用
    eval

  • 通常在读取时使用
    读取结果列表
  • 使用eval将新元素添加到数组中
  • 因此,以下代码:

    printf "%s\n" "${list[@]}" | nl -w1 | sort -k2 | uniq -f1 -D | 
    {
       while read -r n v; do 
          eval "${v}_position_list+=(\"\$n\")"; 
       done;
       declare -p abc_position_list abcde_position_list; 
    }
    
    将使
    声明-p
    输出两个数组声明:

    declare -a abc_position_list=([0]="1" [1]="3" [2]="7")
    declare -a abcde_position_list=([0]="4" [1]="5")
    

    这回答了你的问题吗<代码>0、2、6
    -是否希望数组中的元素带有逗号?@KamilCuk不,对不起,不带逗号。如果需要在数据结构上执行大量工作,请使用其他语言。
    bash
    数组只适合于存储一系列项作为另一个命令的参数。
    declare -a abc_position_list=([0]="1" [1]="3" [2]="7")
    declare -a abcde_position_list=([0]="4" [1]="5")