繁体   English   中英

bash中的包含和排除数组

[英]inclusive and exclusive arrays in bash

我在这里的第一篇文章,让我们看看如何进行。

正在处理我有多个“主机列表”的问题。 一套用于linux,一套用于Windows,一套用于打印机。

我还列出了当前正在监视的内容。

我一直在尝试一些代码,以尝试统一主机列表,然后获取该列表和当前监视列表的区别。

我在这里找到了一些不错的代码:

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

Array3 =diff(Array1, Array2)

理想情况下,Array3应该是:Array3 =(“ key7”“ key8”“ key9”“ key10”)

这为我提供了需要添加的列表,并且效果非常好。

假设Array2包含一个值为“ key11”的元素

如果我使用相同的差异,则会得到所有以前的值和key11。

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

Array3 =diff(Array1, Array2)

输出键11 key10 .....

我想我需要做两件事:

  1. 1!= 2但不是2!= 1的所有事物的列表

  2. 2!= 1但不是1!= 2的所有事物的列表

我希望解释一个事实,即这些内容是由我无法控制的CSV填充的,并且每个主机列表的命名约定都不同,这意味着数组的顺序/数量/等将是未知的。 我该怎么做? 我能看到的逻辑只是代码。 非常感谢您的帮助。 请让我免于整个周末的痛苦。

您可以像这样获得两个数组之差的数组:

Array3=($(sort <(printf "%s\n" "${Array1[@]}") <(printf "%s\n" "${Array2[@]}") | uniq -u))

在这里,我们首先通过使用<()进程替换将它们显示为临时fds来对数组进行排序,在数组中,每一项都在新行上打印。

然后将其传递到uniq -u ,该uniq -u仅打印出唯一的项目,然后首先将整个内容包装在$()捕获字符串,然后将其输入到包装数组()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM