다른 배열의 모든 배열 요소를 검색하시겠습니까?

다른 배열의 모든 배열 요소를 검색하시겠습니까?

이것이 배열의 요소를 검색하는 방법입니다.

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

관련 정보