簡體   English   中英

查找兩個Bash陣列之間常見的項目

[英]Find items common between two Bash arrays

我有下面的shell腳本,其中我有兩個數組number1number2 我有一個可變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_number1new_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的答案,我還可以想到另外兩種方法:

  1. 加載$range的值作為關聯數組的鍵。 值為1 遍歷${number1[@]}${number2[@]}每個成員,根據關聯數組中的值對它們進行測試。
  2. 使用codeforester的printf ... | sort printf ... | sort技巧,但通過sort | uniq -c管道列表和范圍 sort | uniq -c ,然后grep為重復。

我不確定這些中的任何一個是否是對代碼的實際改進。 ...我會創建一個'find duplicates'shell函數,但是否則你的代碼看起來很穩定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM