Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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 使用;“通信”;查找两个数组之间的匹配项_Arrays_Bash_Shell - Fatal编程技术网

Arrays 使用;“通信”;查找两个数组之间的匹配项

Arrays 使用;“通信”;查找两个数组之间的匹配项,arrays,bash,shell,Arrays,Bash,Shell,我有两个数组,我正在尝试使用comm查找匹配值Array1在每个元素中包含一些额外的信息,我将这些信息去掉以进行比较。但是,我希望在比较完成后保留这些信息 例如: Array1=("abc",123,"hello" "def",456,"world") Array2=("abc") declare -a Array1 declare -a Array2 然后比较两个阵列: oldIFS=$IFS IFS=$'\n\t' array3=($(comm -12 <(echo "${Array

我有两个数组,我正在尝试使用
comm
查找匹配值
Array1
在每个元素中包含一些额外的信息,我将这些信息去掉以进行比较。但是,我希望在比较完成后保留这些信息

例如:

Array1=("abc",123,"hello" "def",456,"world")
Array2=("abc")
declare -a Array1
declare -a Array2
然后比较两个阵列:

oldIFS=$IFS IFS=$'\n\t'
array3=($(comm -12 <(echo "${Array1[*]}" | awk -F "," {'print $1'} | sort) <(echo "${Array2[*]}" | sort)))
IFS=$oldIFS
然而,我想要的是数组1中不属于我的
comm
语句的剩余值

abc,123,hello

编辑:了解更多说明

本例中的数组使用虚拟数据填充

我的真实示例是从服务器日志中提取信息,并将其保存到array1中。array1包含(userID、hostip、count),我希望将其与userID列表(array2)进行交叉引用。我的目标是找出array1和array2中存在哪些用户ID,并将这些ID和来自array1(hostIPs,count)的附加信息一起保存到array3中

array1由一个变量填充,该变量是生成splunk搜索的curl命令的结果。返回的数据如下所示:

"uniqueID=<ID>","<IP>","<hostname>",1
join -t, \
    <(printf '%s\n' "${Array1[@]}" | sort -t, -k1,1) \
    <(printf '%s\n' "${Array2[@]}" | sort)
array2是从本地存储的主文件生成的。它包含我们生态系统中的所有应用程序ID。比如说

uid=<ID>
然后我想找到array1中的哪些ID存在于array2中,并将其另存为array3。这需要对array1中的数据进行一些处理,使其与array2的格式匹配

oldIFS=$IFS IFS=$'\n\t'
array3=($(comm -12 <(echo "${array1[*]}" | sed 's/ /\n/g' | awk -F "\"," {'print $1'} | sed 's/\"//g' | sed 's/|/ /g' | awk -F$'=' -v OFS=$'=' '{ $1 = "uid" }1' | grep -i "OU=People" | sed 's/OU/ou/g' | sort) <(echo "${array2[*]}" | sort)))
IFS=$oldIFS
oldIFS=$IFS-IFS=$”\n\t

array3=($(comm-12我不知道如何使用
comm
实现这一点,但我确实为您提供了一个使用
sed
grep
的解决方案。以下命令与regex
uid=X,
匹配,其中字符串/数组的形式分别为
uid=X
(uid=X uid=y)

#数组2(B)是一个字符串
$A=(“uid=1,10.10.10.1,server1,1”“uid=2,10.10.2,server2,1”)
$B=“uid=1”
$echo${A[@]}| grep-oE“([^]*${B},[^]*)”
uid=1,10.10.10.1,服务器1,1
#数组2(D)是一个数组
$C=(${A[@]}“uid=3,10.10.10.3,server3,1”“uid=4,10.10.10.4,server4,1”)
$D=(${B}“uid=3”)
$echo${C[*]}| grep-oE“([^]*($(echo${D[@]}| sed's//,|/g'))[^]*)”
uid=1,10.10.10.1,服务器1,1
uid=3,10.10.10.3,服务器3,1
#数组的内容
$echo${A[@]}
uid=1,10.10.10.1,服务器1,1 uid=2,10.10.10.2,服务器2,1
$echo${B}
uid=1
$echo${C[@]}
uid=1,10.10.10.1,服务器1,1 uid=2,10.10.10.2,服务器2,1 uid=3,10.10.10.3,服务器3,1 uid=4,10.10.10.4,服务器4,1
$echo${D[@]}
uid=1 uid=3

我会这样做:

"uniqueID=<ID>","<IP>","<hostname>",1
join -t, \
    <(printf '%s\n' "${Array1[@]}" | sort -t, -k1,1) \
    <(printf '%s\n' "${Array2[@]}" | sort)

这只做了一个假设,即没有数组元素包含换行符。为了使它更健壮(假设GNU Coreutils),我们可以使用NUL作为分隔符:

join -z -t, \
    <(printf '%s\0' "${Array1[@]}" | sort -z -t, -k1,1) \
    <(printf '%s\0' "${Array2[@]}" | sort -z)
readarray-d
需要Bash 4.4或更新版本。对于较旧的Bash,可以使用循环:

while IFS= read -r -d '' element; do
    Array3+=("$element")
done < <(
    join -z -t, \
        <(printf '%s\0' "${Array1[@]}" | sort -z -t, -k1,1) \
        <(printf '%s\0' "${Array2[@]}" | sort -z)
)
当IFS=read-r-d“”元素时;执行
数组3+=(“$element”)

完成“def”,456,“world”
还有?还有什么阻止您使用
数组1
?编辑问题以获得更多澄清您如何定义这些数组?我的意思是,您如何准确地分配虚拟数组?不清楚您是否假设元素是逗号分隔的还是空格分隔的。如果我不清楚,很抱歉。我的意思是您应该编辑问题以使我能够这里是st。而不是
Array1{“abc”,123,“hello”“def”,456,“world”}
类似于
Array1=(abc,123,hello def,456,world)
(或者应该是
(abc 123 hello def 456 world)
),用你的符号,我不知道数组中到底是什么。
join -t, \
    <(printf '%s\n' "${Array1[@]}" | sort -t, -k1,1) \
    <(printf '%s\n' "${Array2[@]}" | sort)
abc,123,hello
join -z -t, \
    <(printf '%s\0' "${Array1[@]}" | sort -z -t, -k1,1) \
    <(printf '%s\0' "${Array2[@]}" | sort -z)
readarray -d '' -t Array3 < <(
    join -z -t, \
        <(printf '%s\0' "${Array1[@]}" | sort -z -t, -k1,1) \
        <(printf '%s\0' "${Array2[@]}" | sort -z)
)
while IFS= read -r -d '' element; do
    Array3+=("$element")
done < <(
    join -z -t, \
        <(printf '%s\0' "${Array1[@]}" | sort -z -t, -k1,1) \
        <(printf '%s\0' "${Array2[@]}" | sort -z)
)