【问题标题】:Bash: remove an array element which contains a value in another arrayBash:删除包含另一个数组中的值的数组元素
【发布时间】:2016-03-15 21:17:10
【问题描述】:

我想删除包含另一个数组元素的数组元素。

EG

array1 = (aaaa bbbb abcd)

array2 = (b c)

结果 = (aaaa)

我已经写了这段代码,但它不起作用

for element in "${array2[@]}"
    do
        result=(${array1[@]/.*$element.*})
    done

你能告诉我为什么以及我应该怎么做吗?

【问题讨论】:

  • 请在您的问题中包含预期和实际结果。

标签: arrays bash


【解决方案1】:

我认为您误认为需要逗号作为数组元素之间的分隔符。但逗号实际上成为元素的一部分。 除此之外,result 也不会工作,因为您需要聚合已删除的元素。但是result 是从array1 分配的。所以 element 被移除了 来自上一次迭代的将再次成为resut 的一部分。

array1=(aaaa bbbb abcd)
array2=(b c)   
result=("${array1[@]}")

for element in "${array2[@]}"
do
     result=(${result[@]/*${element}*/})
done

echo "${result[@]}"

这会将数组复制到result 数组中,并使用array2 从中删除元素。

【讨论】:

  • 对不起,逗号只是报错。我遇到问题的代码中没有逗号。顺便感谢您的提示...我没有注意到!我将编辑并更正我的帖子。
  • 我想通了。问题还在于您的替换。你可以看到答案的不同。如果您可以修改它,您也可以使用array1 本身。
【解决方案2】:

这是我的尝试。 我很确定这可以用awk 完全完成,但我还没有找到方法:

#!/bin/bash
array1=(aaaa bbbb abcd)
array2=(b c)   
result=()
for i in "${array1[@]}"
do
   sumIndexOf=0
   for j in "${array2[@]}"
   do
        sumIndexOf=$((sumIndexOf + $(echo $i $j | awk '{print index($1,$2)}')))     
   done
   if [ "$sumIndexOf" = "0" ]; then
        result+=($i)
   fi   
done
printf '%s\n' "${result[@]}"

参考/使用:

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2013-11-26
    • 2011-05-20
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多