Arrays 找出'array2'中缺少'array1'的哪些值`
在bash中,如何获得在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")
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脚本的真正用途。当然,这是可能的,但是您心里有具体的目标吗?您可以使用
而不是IFS+echo构造。在本例中,使用printf“%s\n”“${array1[@]}”
而不是“${array1[@]}”
与“${array1[*]}”
变量有关;使用printf
可以将单个字符串作为参数传递给*
@JonathanLeffler,这确实更优雅<代码>“${array1[*]}”而不是printf
在我的变体中也很重要,顺便说一句,否则“${array1[@]}”
不用于分隔数组元素-只是一个空格。您可以使用IFS
而不是printf”%s\n“${array1[@]}”而不是IFS+echo构造。在本例中,使用
而不是“${array1[@]}”
与“${array1[*]}”
变量有关;使用printf
可以将单个字符串作为参数传递给*
@JonathanLeffler,这确实更优雅<代码>“${array1[*]}”printf
在我的变体中也很重要,顺便说一句,否则“${array1[@]}”
不用于分隔数组元素-只是一个空格。IFS
- 每行打印一个数组元素并排序: