@ilya-bystrov最受欢迎的答案计算了Array1
和Array2
之间的差异。请注意,这与从Array1
中删除在Array2
中也存在的项目是不同的。@ilya-bystrov的解决方案将两个列表连接起来并删除非唯一值。当Array2
包含不在Array1
中的项目时,这是一个巨大的区别:Array3
将包含在Array2
中但不在Array1
中的值。
这里有一个纯Bash解决方案,用于从Array1
中删除在Array2
中也存在的项目(请注意Array2
中的附加"key11"
):
Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" "key11" )
Array3=( $(printf "%s\n" "${Array1[@]}" "${Array2[@]}" "${Array2[@]}" | sort | uniq -u) )
Array3
将由 "key7" "key8" "key9" "key10"
组成,并在尝试从 Array1
中删除项目时排除意外的 "key11"
。
如果您的数组项可能包含空格,请使用 mapfile
构建 Array3
,如 @David 建议的那样:
Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" "key11" )
mapfile -t Array3 < <(printf "%s\n" "${Array1[@]}" "${Array2[@]}" "${Array2[@]}" | sort | uniq -u)
请注意:这假设
Array1
中的所有值都是唯一的。否则它们将不会出现在
Array3
中。如果
Array1
包含重复的值,则必须先删除重复项(请注意
Array1
中的重复
"key10"
;如果您的项目包含空格,则可能使用
mapfile
):
Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" "key11" )
Array3=( $({ printf "%s\n" "${Array1[@]} | sort -u; printf "%s\n" "${Array2[@]}" "${Array2[@]}"; } | sort | uniq -u) )
如果你想要将
Array1
中的重复项复制到
Array2
中,可以选择使用@ephemient的答案。如果
Array1
和
Array2
非常大,同样适用:对于很多项来说,这是一个非常低效的解决方案,尽管对于少量项(小于100)来说可以忽略不计。如果你需要处理大型数组,请不要使用Bash。