搜索另一个数组中的所有数组元素?

搜索另一个数组中的所有数组元素?

这就是我在数组中搜索元素的方式。

count=${#ARRAY[@]}

lsearch()
{
  status=-1

  for((i=0;i<count;i++))
  do
     Temp=$1

     if [[ $Temp -eq ${ARRAY[i]} ]]
       then
         status=0
         searches=$((i+1))
         return
     fi
   done
}

(a b c d)假设我需要在另一个数组中查找一个数组的所有元素( a h c d l k)

现在,对于一个数组中的每个元素,我需要使用 for 循环遍历另一个数组。还有更好的办法吗?

答案1

如果您不想为第一个数组中的每个值循环遍历第二个数组的每个条目,则需要使用关联数组。在 awk 中你可以这样做:

$ a=(a b c d);
$ b=(a h c d l k);
$ awk 'BEGIN{RS = FS} NR == FNR {a[$1] = 1; next} $1 in a' \
    <(echo "${a[*]}") <(echo "${b[*]}")
a
c
d

纯粹的 bash 看起来像这样(尽管它有点笨拙:

declare -A a
a=([a]=1 [b]=1 [c]=1 [d]=1)
declare -A b
b=([a]=1 [h]=1 [c]=1 [d]=1 [l]=1 [k]=1)
for i in ${!a[*]}; do
    if [ ! -z "${b[$i]}" ]; then 
        echo "$i is in both";
    fi;
done

答案2

纯 bash 不会循环遍历第二个数组中的每个项目,而且也不像那样“笨拙”这个答案

a=(a b c d);
b=(a h c d l k);

newArr=($(
    for item in ${a[@]}; do
        [[ ${b[*]} =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] \
        && echo "$item"
    done    
))
echo ${newArr[@]}

a c d
echo ${!newArr[@]}

0 1 2

还可以从第一个数组中的项目创建一个新数组不是在第二个数组中。只需将 更改&&||.

newArr=($(
    for item in ${a[@]}; do
        [[ ${b[*]} =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] \
        || echo "$item"
    done    
))
echo ${newArr[@]}

b

相关内容