[英]Find items common between two Bash arrays
我有下面的shell腳本,其中我有兩個數組number1
和number2
。 我有一個可變range
,其中包含數字列表。
現在我需要弄清楚number1
數組中的所有數字在range
變量中也存在。 同樣對於number2
數組也是如此。 下面是我的shell腳本,它運行正常。
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[@]}"
有沒有更好的方法來寫上面的東西? 截至目前,我有兩個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
printf ... | sort
對為comm提供排序的輸入流 comm -12
發出兩個流共有的項 除了codeforester的答案,我還可以想到另外兩種方法:
$range
的值作為關聯數組的鍵。 值為1
。 遍歷${number1[@]}
和${number2[@]}
每個成員,根據關聯數組中的值對它們進行測試。 printf ... | sort
printf ... | sort
技巧,但通過sort | uniq -c
管道列表和范圍 sort | uniq -c
,然后grep為重復。 我不確定這些中的任何一個是否是對代碼的實際改進。 ...我會創建一個'find duplicates'shell函數,但是否則你的代碼看起來很穩定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.