[英]Get common elements in 3 arrays in shell scripting
此代碼適用於 2 個數組,但我想再添加一個數組進行比較,這是怎么做的? 謝謝
array1=(20 30 40 50)
array2=(10 20 30 80 100 110 40)
declare -a array3
#sort both arrays
readarray array1 <<<"$(printf "%s\n" "${array1[@]}" | sort -n)"
readarray array2 <<<"$(printf "%s\n" "${array2[@]}" | sort -n)"
# look for values
i2=0
for i1 in ${!array1[@]}; do
while (( i2 < ${#array2[@]} && ${array1[$i1]} > ${array2[$i2]} )); do (( i2++ )); done
[[ ${array1[$i1]} == ${array2[$i2]} ]] && array3+=(${array1[$i1]})
done
echo ${array3[@]}
您的固定腳本:
#!/usr/bin/env bash
declare -ai array1=(20 30 40 50)
declare -ai array2=(10 20 30 80 100 110 40)
declare -ai array3=()
#sort both arrays
readarray -t array1 < <(printf "%s\n" "${array1[@]}" | sort -n)
readarray -t array2 < <(printf "%s\n" "${array2[@]}" | sort -n)
# look for values
i2=0
for i1 in "${!array1[@]}"; do
while ((i2 < ${#array2[@]} && array1[i1] > array2[i2])); do
((i2++))
done
if [[ ${array1[$i1]} -eq ${array2[$i2]} ]]; then
array3+=($((array1[i1])))
fi
done
echo "${array3[@]}"
或者更短、更高效、更可靠的版本,可以處理任意數量的數組
#!/usr/bin/env bash
declare -ai array1=(20 30 40 50)
declare -ai array2=(10 20 30 80 100 110 40)
declare -ai array3=(30 50 80 40 10)
declare -ai array4=(110 80 30 50 40)
declare -i arrays_cnt=4
declare -ai common=()
# Or in one go
mapfile -d '' common < <(
printf %d\\0 "${array1[@]}" "${array2[@]}" "${array3[@]}" "${array4[@]}" \
| sort -zn \
| uniq -zcd \
| grep -z "^\ *$arrays_cnt" \
| cut -zb9-
)
echo "${common[@]}"
如果真的不想使用外部工具而是使用 Bash 4.2+ 關聯數組:
#!/usr/bin/env bash
declare -ai array1=(20 30 40 50)
declare -ai array2=(10 20 30 80 100 110 40)
declare -ai array3=(30 50 80 40 10)
declare -ai array4=(110 80 30 50 40)
declare -i arrays_cnt=4
declare -ai common=()
declare -Ai key_count=()
# Count occurrences of keys
for k in "${array1[@]}" "${array2[@]}" "${array3[@]}" "${array4[@]}"; do
key_count[$k]+=1
done
# Populates common array with non-unique keys
for k in "${!key_count[@]}"; do
[ ${key_count[$k]} -eq $arrays_cnt ] && common+=("$k")
done
echo "${common[@]}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.