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
的解决方案。以下命令与regexuid=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)
)