【问题标题】:Compare three arrays in bash, diff and identical values [duplicate]比较bash,diff和相同值中的三个数组[重复]
【发布时间】:2016-06-06 07:16:42
【问题描述】:

这个问题是指已回答的问题: Compare/Difference of two arrays in bash

让我们取两个数组:

Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key13" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" "key11" "key12" "key13" )

数组之间的对称差异:

Array3=(`echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u `)

Array3 值:

echo $Array3
key10
key11
key12
key7
key8
key9

仅在 Array1 中的值:

echo ${Array1[@]} ${Array3[@]} | tr ' ' '\n' | sort | uniq -D | uniq
key10
key7
key8
key9

仅在 Array2 中的值

echo ${Array2[@]} ${Array3[@]} | tr ' ' '\n' | sort | uniq -D | uniq
key11
key12

我的问题,我们如何才能获得 Array1 和 Array2 中但不在 Array3 中的值(相同)? 预期结果:

key1
key13
key2
key3
key4
key5
key6

感谢您的帮助。

【问题讨论】:

  • 如果数组包含它们被设计包含的数据,则对称差异的代码会中断:包含空格的元素。

标签: arrays bash compare diff


【解决方案1】:

经过几次测试后确定,看来我正在寻找的答案只是:

echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -D | uniq
key1
key13
key2
key3
key4
key5
key6

【讨论】:

  • 不过,这会破坏包含空格的元素。
【解决方案2】:

您可以通过以下方式实现:

#!/bin/bash

Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key13" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" "key11" "key12" "key13" )

Array3=(`echo ${Array1[@]} ${Array2[@]} | tr ' ' '\n' | sort | uniq -u `)

intersections=()

for item1 in "${Array1[@]}"; do
    for item2 in "${Array2[@]}"; do
        for item3 in "${Array3[@]}"; do
            if [[ $item1 == "$item2" && $item1 != "$item3" ]]; then
                    intersections+=( "$item1" )
                    break
            fi
        done
    done
done

printf '%s\n' "${intersections[@]}"

输出:

key1
key2
key3
key4
key5
key6
key13

【讨论】:

  • 嗨@arzyfex。感谢您的回答,但如果我的 diff Array3 为空,它将不起作用。如果 Array3 为空,我可以添加一个条件。我们可以用 Array3 中提供的 echo 样式做同样的事情吗?
猜你喜欢
  • 2016-09-11
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多