比较两个数组并提取仅存在于一个数组中的元素?

时间:2014-04-02 07:33:12

标签: bash

比较两个数组并提取仅存在于其中一个数组中的元素的最简单方法是什么?

即。 - 整体 - 减去共同元素的集合?

A = [2,3,4,5]
B = [1,3,4,5]

提取1,2?

尝试在bash中编写脚本。

2 个答案:

答案 0 :(得分:2)

创建第三个数组,该数组由要比较的两个数组的值索引。为每个条目分配1,同时添加第一个数组和'或'添加第二个数组时每个条目都有2个 - 如果条目在两个原始数组中,则将比较数组中的值设置为3. N.B.这会将其中一个源数组中的多个条目视为单个条目。

A=( 2 3 4 5 x x )
B=( 1 3 4 5 )

typeset -A C

for n in "${A[@]}" ; do C[$n]=1 ; done

for n in "${B[@]}" ; do (( C[$n] |= 2 )) ; done

for n in "${!C[@]}" ; do [[ ${C[$n]} -le 2 ]] && echo "$n" ; done

#  for n in "${!C[@]}" ; do [[ ${C[$n]} -gt 2 ]] && unset C[$n] ; done
#  uniques=( "${!C[@]}" )

答案 1 :(得分:1)

使用awk:

awk 'FNR==NR{a[$0];next} $0 in a{delete a[$0]; next} {a[$0]} 
     END{for (i in a) print i}' <(printf "%s\n" "${A[@]}") <(printf "%s\n" "${B[@]}")
1
2

使用grep:

grep -vf <(printf "%s\n" "${A[@]}") <(printf "%s\n" "${B[@]}") && grep -vf <(printf "%s\n" "${B[@]}") <(printf "%s\n" "${A[@]}")
1
2

使用comm(假设输入数组已经排序):

comm -3 <(printf "%s\n" "${A[@]}") <(printf "%s\n" "${B[@]}")|tr -d '\t'
1
2