私は2つの配列number1
とを持っている以下のシェルスクリプトを持っていますnumber2
。range
数値のリストを持つ変数があります。
ここで、number1
配列にあるすべての数値がrange
変数にも存在することを理解する必要があります。同様のためnumber2
だけでなく、アレイ。以下は私のシェルスクリプトで、正常に動作しています。
number1=(1220 1374 415 1097 1219 557 401 1230 1363 1116 1109 1244 571 1347 1404)
number2=(411 1101 273 1217 547 1370 286 1224 1362 1091 567 561 1348 1247 1106 304 435 317)
range=90,197,521,540,552,554,562,569:570,573,576,579,583,594,597,601,608:609,611,628,637:638,640:641,644:648
range_f=" "$(eval echo $(echo $range | perl -pe 's/(\d+):(\d+)/{$1..$2}/g;s/,/ /g;'))" "
echo "$range_f"
for item in "${number1[@]}"; do
if [[ $range_f =~ " $item " ]] ; then
new_number1+=($item)
fi
done
echo "new list: ${new_number1[@]}"
for item in "${number2[@]}"; do
if [[ $range_f =~ " $item " ]] ; then
new_number2+=($item)
fi
done
echo "new list: ${new_number2[@]}"
上記のものを書くためのより良い方法はありますか?今のところ、2つのforループを繰り返してからnew_number1
、new_number2
配列を計算しています。
注:644:648
平均のような数字は、644で始まり、648で終わります。これは単なる短い形式です。
comm
ループする代わりに、プロセス置換とともに使用できます。
mapfile -t new_number1 < <(comm -12 <(printf '%s\n' "${number1[@]}" | sort) <(printf '%s\n' $range_f | sort))
mapfile -t new_number2 < <(comm -12 <(printf '%s\n' "${number2[@]}" | sort) <(printf '%s\n' $range_f | sort))
mapfile -t name
ネストされたプロセス置換から名前付き配列に読み取りますprintf ... | sort
ペアは、通信用にソートされた入力ストリームを提供しますcomm -12
2つのストリームに共通のアイテムを放出しますこの記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加