Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 找出'array2'中缺少'array1'的哪些值`_Arrays_Bash_Comparison - Fatal编程技术网

Arrays 找出'array2'中缺少'array1'的哪些值`

Arrays 找出'array2'中缺少'array1'的哪些值`,arrays,bash,comparison,Arrays,Bash,Comparison,在bash中,如何获得在array1中存在但在array2中不存在的第三个值数组?在上面的示例中,预期的输出是(4 8),带有映射文件、通信、排序和进程替换: 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 ) 由内而外的解释: 每行打印一个数组元素并排序: $ declare -p arr declare -a arr='([0]="4" [1]="8")

在bash中,如何获得在
array1
中存在但在
array2
中不存在的第三个值数组?在上面的示例中,预期的输出是
(4 8)

,带有
映射文件
通信
排序
和进程替换:

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 )
由内而外的解释:

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

    $ declare -p arr
    declare -a arr='([0]="4" [1]="8")'
    
    对于
    array2
    也一样

  • 将这些管道包装到进程替换中,并将其用作
    comm
    的参数:

    $ printf "%s\n" "${array1[@]}" | sort -n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
  • 使用
    mapfile
    将每一行读入数组元素(
    -t
    删除换行):


    mapfile-t arr<与
    mapfile
    comm
    排序
    和流程替换:

    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 )
    
    由内而外的解释:

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

      $ declare -p arr
      declare -a arr='([0]="4" [1]="8")'
      
      对于
      array2
      也一样

    • 将这些管道包装到进程替换中,并将其用作
      comm
      的参数:

      $ printf "%s\n" "${array1[@]}" | sort -n
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
    • 使用
      mapfile
      将每一行读入数组元素(
      -t
      删除换行):


      mapfile-t arr<以下联机程序将实现此功能:

      mapfile -t arr < <(comm -23 --nocheck-order \
                         <(printf "%s\n" "${array1[@]}" | sort -n) \
                         <(printf "%s\n" "${array2[@]}" | sort -n))
      
      现在,您只需过滤
      |
      (或有时
      )后面的数字。我为此使用了
      grep
      ,但是也可以使用
      sed
      。如果数组未排序,只需向每个
      printf
      添加排序,如下所示:

      1           1    
      2           2
      3           3
      5         | 4
      6           5
      7           6   
      9           7
      10        | 8
      11          9
      12          10
                  11
                  12
      

      下面的在线者可以做到这一点:

      mapfile -t arr < <(comm -23 --nocheck-order \
                         <(printf "%s\n" "${array1[@]}" | sort -n) \
                         <(printf "%s\n" "${array2[@]}" | sort -n))
      
      现在,您只需过滤
      |
      (或有时
      )后面的数字。我为此使用了
      grep
      ,但是也可以使用
      sed
      。如果数组未排序,只需向每个
      printf
      添加排序,如下所示:

      1           1    
      2           2
      3           3
      5         | 4
      6           5
      7           6   
      9           7
      10        | 8
      11          9
      12          10
                  11
                  12
      

      @andlrc。谢谢我不太明白什么是命令替换(但会调查这个问题)。我已更改了第一个以正确定义数组。@Remi.b您这样做的原因是什么?这并不是shell脚本的真正用途。当然这是可能的,但你心里有明确的目标吗?@andlrc。谢谢我不太明白什么是命令替换(但会调查这个问题)。我已更改了第一个以正确定义数组。@Remi.b您这样做的原因是什么?这并不是shell脚本的真正用途。当然,这是可能的,但是您心里有具体的目标吗?您可以使用
      printf“%s\n”“${array1[@]}”
      而不是IFS+echo构造。在本例中,使用
      “${array1[@]}”
      而不是
      “${array1[*]}”
      printf
      变量有关;使用
      *
      可以将单个字符串作为参数传递给
      printf
      @JonathanLeffler,这确实更优雅<代码>“${array1[*]}”
      而不是
      “${array1[@]}”
      在我的变体中也很重要,顺便说一句,否则
      IFS
      不用于分隔数组元素-只是一个空格。您可以使用
      printf”%s\n“${array1[@]}”而不是IFS+echo构造。在本例中,使用
      “${array1[@]}”
      而不是
      “${array1[*]}”
      printf
      变量有关;使用
      *
      可以将单个字符串作为参数传递给
      printf
      @JonathanLeffler,这确实更优雅<代码>“${array1[*]}”
      而不是
      “${array1[@]}”
      在我的变体中也很重要,顺便说一句,否则
      IFS
      不用于分隔数组元素-只是一个空格。