找出`array2`中缺少`array1`的值

时间:2016-06-08 22:29:33

标签: arrays bash comparison

tr//

在bash中,我如何获得declare -a array1=( 1 2 3 4 5 6 7 8 9 10 11 12 ) declare -a array2=( 1 2 3 5 6 7 9 10 11 12 ) 中存在但在array1中不存在的值的第三个数组?在上面的示例中,预期输出为array2

2 个答案:

答案 0 :(得分:1)

使用mapfilecommsort和流程替换:

array1=( 1 2 3 4 5 6 7 8 9 10 11 12 )
array2=( 1 2 3 5 6 7 9 10 11 12 )
mapfile -t arr < <(comm -23 --nocheck-order \
                       <(printf "%s\n" "${array1[@]}" | sort -n) \
                       <(printf "%s\n" "${array2[@]}" | sort -n))

结果:

$ declare -p arr
declare -a arr='([0]="4" [1]="8")'

解释,由内而外:

  • 每行打印一个元素并排序:

    $ printf "%s\n" "${array1[@]}" | sort -n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    

    array2相同。

  • 将这些管道包装成流程替换并将其用作comm的参数:

    comm -23 --nocheck-order \
        <(printf "%s\n" "${array1[@]}" | sort -n) \
        <(printf "%s\n" "${array2[@]}" | sort -n)
    

    -23将结果减少为第一个数组唯一的值; --nocheck-order禁止输入未按字典顺序排序的警告。输出是

    4
    8
    
  • 使用mapfile-t删除换行符)将每行读入数组元素:

    mapfile -t arr < <(comm -23 --nocheck-order \
                       <(printf "%s\n" "${array1[@]}" | sort -n) \
                       <(printf "%s\n" "${array2[@]}" | sort -n))
    

    现在,arr包含两个值,如上所示。

sort步骤并非严格要求,但也使解决方案适用于非排序数组。

答案 1 :(得分:1)

以下在线游戏可以解决问题:

image_name

diff -y <(printf '%s\n' "${array2[@]}") <(printf '%s\n' "${array1[@]}") | grep -Po '[\|\<\>][\t]\K[0-9]+$' 用于在单独的行中打印元素。现在printf给出了输出:

diff -y

现在,您必须在1 1 2 2 3 3 5 | 4 6 5 7 6 9 7 10 | 8 11 9 12 10 11 12 之后(或有时|<)过滤数字。我为此使用了>,但也可以使用grep。如果您的数组未排序,只需向每个sed添加排序,如下所示:

printf