Bashスクリプトでは、2つの動的配列を構築しています。 2つの異なる別の配列を構成したいと思います。
例:
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
2番目の配列で正規表現を構築し、最初の配列の要素を比較します。
$ 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