簡體   English   中英

在 shell 腳本中獲取 3 個數組中的公共元素

[英]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.

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