unix 在多个数组中搜索值并返回数组名称[closed]

xyhw6mcr  于 2023-08-04  发布在  Unix
关注(0)|答案(2)|浏览(132)

已关闭。此问题需要更多focused。它目前不接受回答。
**希望改进此问题?**更新问题,使其仅针对editing this post的一个问题。

6天前关门了。
Improve this question
我有一个要求,其中我有多个值在一个文件和8个数组包含数值。举例来说:

Array1=(1 2 3 4 5) 
Array2=(6 7 8 9 10)

字符串
文件具有值3和9。因此,在第一种情况下,它应该返回Array1,在第二种情况下,它应该返回Array2。另外,我想将结果存储在另一个文件中,该文件的值后跟包含该值的数组名称。
无法找到任何解决方案。

sxissh06

sxissh061#

如果你的bash足够近:

for a in Array1 Array2; do
  declare -n arr="$a"
  grep -oFf <(printf '%s\n' "${arr[@]}") file && printf '(in %s)\n' "$a"
done > results

字符串
说明:

  • declare -n arr="$a"声明了一个nameref,一种别名。如果在a的值为Array1时执行,则arr成为Array1的同义词。
  • printf '%s\n' "${arr[@]}"将数组arr中的每个条目打印在单独的一行上。
  • <(command)是一个进程替换,运行该命令,其输出被环境视为一个文件。在我们的例子中,数组的内容被视为每行一个条目的文件。
  • grep -oFf file1 file2采用file1-f file1)中的模式进行搜索,在我们的例子中,在进程替换中,将它们视为纯文本字符串,而不是正则表达式(-F),并仅输出匹配的部分(-o)。
  • grep如果模式匹配,则以状态0退出,否则以非零状态退出。由于0退出状态被认为是布尔值true,因此只有当grepfile中找到其中一个模式时,printf '(in %s)\n'才会执行打印数组名称的printf '(in %s)\n',这要归功于&&操作符(AND)。

演示(输出前缀为-|):

printf '3\n9\n15\n' > file
Array1=(1 2 3 4 5)
Array2=(6 7 8 9 10)
Array3=(a b c d e)
for a in Array1 Array2 Array3; do
  declare -n arr="$a"
  grep -oFf <(printf '%s\n' "${arr[@]}") file && printf '(in %s)\n' "$a"
done > results
cat results
-| 3
-| 1
-| 5
-| (in Array1)
-| 9
-| (in Array2)

ufj5ltwl

ufj5ltwl2#

试试这个Shellcheck-clean pure Bash代码:

#! /bin/bash -p

Array1=(1 2 3 4 5) 
Array2=(6 7 8 9 10) 

while read -r val || [[ -n $val ]]; do
    for arr in Array1 Array2; do
        aref="${arr}[@]"
        for elem in "${!aref}"; do
            if [[ $elem == "$val" ]]; then
                printf '%s %s\n' "$val" "$arr"
                break
            fi
        done
    done
done <file

字符串

相关问题