Bash 스크립트에서는 두 개의 동적 배열을 구축하고 있습니다. 두 개가 다른 또 다른 배열을 구성하고 싶습니다.
예:
array1=("aa-1234|safsf|sfsfs" "aa-2345|sfsfs|n0sfm" "aa-0890|ssfsf|sfss" "aa-8097|fsfsf|fsfs" "bb-1234|xvxx|xvxv" "cc-1234|jmsf|sfsfs" "cc-1235|xvxv|xvxv")
array2=(aa-1234 aa-8097)
array1 요소는 긴 항목이며 |
각 항목은 구분 기호 역할을 합니다.
이제 array2에서 일치하는 요소를 제외하고 모든 요소가 array1의 요소인 array3을 구성하려고 합니다.
요소를 건너뛰기 위해 루프 를 시도했습니다 for
. 그러나 array1은 매우 길고 시간이 너무 많이 걸립니다. 좀 더 효율적인 방법을 찾고 있어요.
답변1
두 번째 배열에서 정규식을 구성하고 첫 번째 배열의 요소를 비교할 것입니다.
$ re=$(IFS='|'; echo "^(${array2[*]})\|")
$ echo "$re"
^(aa-1234|aa-8097)\|
$ for elem in "${array1[@]}"; do if [[ $elem =~ $re ]]; then array3+=("$elem"); fi; done
$ printf "%s\n" "${array3[@]}"
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs
배열이 표시된 것보다 훨씬 큰 경우 연습을 다음에 할당하겠습니다.grep
$ grep -Ff <(printf "%s\n" "${array2[@]}") <(printf "%s\n" "${array1[@]}")
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs