将由空格分隔的行分割为一个关联数组

问题描述 投票:1回答:4

如果我有一个变量,其数据如下:

Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205

我正在尝试将我的$ var转换为预期的关联数组,如下所示。

var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap
$ varMap[Audit]=9201
$ varMap[Management]=9202
$ varMap[Inventory]=9203
$ varMap[Source]=9204
$ varMap[Flemingo]=9205

是否有任何有效的方法可以将上面的$ var变量转换为一个关联数组,以便我可以根据其余代码中的键执行查找?

linux bash shell dictionary associative-array
4个回答
0
投票

您可以尝试以下操作:

var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap="($(sed 's/\([^[:blank:]]\+\)[[:blank:]]\+\([^[:blank:]]\+\)/\[\1]=\2/g' <<< "$var"))"

# test
for i in "${!varMap[@]}"; do
    echo "$i => ${varMap[$i]}"
done

结果:

Audit => 9201
Flemingo => 9205
Management => 9202
Source => 9204
Inventory => 9203

0
投票

像这样,简单,易读且有效:)

# declare a simple string
var='Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205'

# declare a simple array, using word spliting
arr=( $var )

# declare an associative array
declare -A varmap

# iterating over array to feed varmap associative array
for ((i=0; i<${#arr[@]}; i+=2)) {
    varmap[${arr[i]}]=${arr[i+1]}
}

# test of one of a key
echo ${varmap[Management]}

输出

9202

0
投票

[请您试一下。这将创建动态的自动化脚本,该脚本将具有自动化的数组创建功能,并且还将打印其键和值。 (这些是OP自己在后期提供的测试样本)

var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
echo "$var" | 
awk -v s1="\"" -v array_name="arrvar" '
BEGIN{
  print "declare -A " array_name
}
{
  for(i=1;i<=NF;i+=2){
    print array_name "["$i"]="$(i+1)
  }
}
END{
  print "echo keys, values here for array.." ORS \
  "for key in " s1 "${!"array_name"[@]}" s1 "; do echo " s1 "$key => ${"array_name"[$key]}" s1 "; done"
}
' > file.ksh;chmod 755 file.ksh;./file.ksh

下面的shell脚本将由上述命令创建:

cat file.ksh
declare -A arrvar
arrvar[Audit]=9201
arrvar[Management]=9202
arrvar[Inventory]=9203
arrvar[Source]=9204
arrvar[Flemingo]=9205
echo keys, values here for array..
for key in "${!arrvar[@]}"; do echo "$key => ${arrvar[$key]}"; done

逻辑解释:]

  • 创建/定义外壳变量(在这种情况下为var)。
  • 我们可以提供名为(在此示例中为vararr的数组。
  • 这将创建一个名为file.ksh的脚本,您可以根据需要对其进行更改。
  • awk代码在做什么,先读取var(shell变量),然后读取其打印命令,以创建由您提供的命名数组。它还正在打印该数组的键和值。注意:它只编写命令来执行此操作,到目前为止尚未执行它们。
  • 将输出保存到名为file.ksh的脚本文件中(您可以保留所需的任何名称)。
  • 现在已授予file.ksh权限并运行它,它实际上将创建一个由您提供的名为的数组,并且还会打印带有索引的值。

0
投票
var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap

while [ "$var" ]; do
    read key value var <<< "$var"
    varMap[$key]=$value
done
© www.soinside.com 2019 - 2024. All rights reserved.