Bash配列の比較

Bash配列の比較

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

おすすめ記事