他の配列のすべての配列要素を検索しますか?

他の配列のすべての配列要素を検索しますか?

これが配列の要素を検索する方法です。

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

最初の配列の各値に対して2番目の配列の各項目を繰り返さない場合は、連想配列を使用する必要があります。 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 は、2 番目の配列のすべての項目を繰り返すわけではありません。この回答

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

最初の配列の項目から新しい配列を作成することもできます。いいえ2番目の配列にあります。&&に変えれば||

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

b

関連情報