bash

时间:2017-05-12 17:04:02

标签: arrays 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"

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

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

Array3 =diff(Array1, Array2)

这个输出 key 11 key10 .....

我想我需要做两件事:

  1. 1!= 2但不是2的所有内容的列表!= 1

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

  3. 我希望说明这些内容是由CSV填充的,其内容我无法控制,每个主机列表的命名约定的变化意味着数组的顺序/数量/等等未知。 我该怎么办?我可以看到这个逻辑不是代码。非常感谢任何帮助。请让我免受整个周末的痛苦。

1 个答案:

答案 0 :(得分:0)

您可以获得两个数组的差异数组,如下所示:

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

我们首先通过将数组作为临时fds进行排序,并使用<()进程替换来对数组进行排序,其中数组将在新行上打印每个项目。

然后通过管道传输到uniq -u,只打印出唯一的项目,然后在$()中首先包装整个内容,捕获字符串,然后输入到包装数组()