【问题标题】:Find multiple duplicates and their indices in array using Bash?使用 Bash 在数组中查找多个重复项及其索引?
【发布时间】:2019-12-12 09:58:51
【问题描述】:

我有一个包含以下值的数组:

list=("abc" "abcd" "abc" "abcde" "abcde" "abcdf" "abc")

有没有办法将重复项的索引放入另一个数组中,例如:

abc_position_list=(0, 2, 6)
abcde_position_list=(3, 4)

我设法将所有索引放入一个数组中,但这样一来,您将不知道哪些索引具有相同的值。

这甚至可以用 bash 做,还是 python 更合适?

【问题讨论】:

  • 这能回答你的问题吗? search duplicate element array
  • 0, 2, 6 - 你想要数组中的元素用逗号吗?
  • @KamilCuk 不,抱歉,没有逗号。
  • 如果您需要在数据结构上做这么多工作,请使用不同的语言。 bash 数组仅适用于存储一系列项目以用作另一个命令的参数。

标签: arrays linux bash


【解决方案1】:
  1. printf "%s\n" ${list[@]} - 将数组打印为换行符分隔的元素。
  2. nl -w1 - 为每个元素添加另一列 - 编号。
  3. sort -k2 按值对列表进行排序
  4. uniq -f1 -D - 忽略第一列打印重复的元素。

与:

printf "%s\n" "${list[@]}" | nl -w1 | sort -k2 | uniq -f1 -D

你会得到的;

1   abc
3   abc
7   abc
4   abcde
5   abcde

所以现在是创建数组的时候了。因为你想从列表中提取数组名称,我想我们必须使用evalwhich is very unsafe

  1. 通常使用while read 读取结果列表。
  2. 使用 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; 
}

将使declare -p 输出两个数组声明:

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

【讨论】:

    【解决方案2】:

    在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多