【发布时间】:2020-09-03 16:26:48
【问题描述】:
此代码适用于 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[@]}
【问题讨论】:
-
这能回答你的问题吗? join multiple files;或者:
join <(join <(sort f1) <(sort f2)) <(sort f3);将结果输入目标数组应该很容易 -
请注意,如果您的数组包含文字换行符,当前代码将表现不佳;使用
readarray -d '' array1 < <(printf '%s\0' "${array1[@]}" | sort -nz)可以避免这种情况。 (当然,如果都是数字也没关系)。 -
...和一般,当您想要进行集合算术(查找两个排序流之间共同的值 - 或仅在一个或另一个中)时,适合这项工作的工具是
comm,而不是尝试自己动手。见BashFAQ #36。 -
(这里也有一些引用问题,像大拇指一样突出;当您不引用扩展时,您将失去
"${array[@]}"相对于${array[*]}的所有优势)跨度> -
...要获取 comm 中三个已排序流之间的共同项目,您可以组合两个实例:
comm -12 <(printf '%s\n' "${sortedListOne[@]}") <(comm -12 <(printf '%s\n' "${sortedListTwo[@]}") <(printf '%s\n' "${sortedListThree[@]}") )-- 请注意 comm 需要字典排序,而不是数字排序。跨度>