首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何填充bash中的多行关联数组

如何填充bash中的多行关联数组
EN

Stack Overflow用户
提问于 2020-02-20 07:08:34
回答 1查看 432关注 0票数 0

我试图从下面的示例文件中填充bash中的关联数组

代码语言:javascript
复制
interface GigabitEthernet1/0/1
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp
interface GigabitEthernet1/0/2
 mls qos trust dscp
interface GigabitEthernet1/0/3
interface GigabitEthernet1/0/4
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp
interface GigabitEthernet1/0/5
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp
interface GigabitEthernet1/0/6
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp
interface GigabitEthernet1/0/7
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp
interface GigabitEthernet1/0/8
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp

interface GigabitEthernet1/0/1GigabitEthernet1/0/1应该是数组键,接口段之间的任何内容都应该是数组键值。

代码语言:javascript
复制
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp

预期产出应是:

代码语言:javascript
复制
 $echo ${array[GigabitEthernet1/0/4]}
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp

将有多个不同的文件具有类似的格式,所以这需要通过循环来完成,接口之间的文本应该是0到5-6行。背后的原因是,我需要对每个接口进行逻辑测试,如果它是正确的或不正确的。下面的文本是正确的,其他任何内容,或空字段都是不正确的。

代码语言:javascript
复制
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp

到目前为止,我一直坚持格式化IFS和多行作为数组键的值。我能够填充非关联数组,但不是最干净的形式。

代码语言:javascript
复制
$ cat test_compare_interface | sed 's/interface.*$/*\n&/g' > test_compare_interface_sed

test_compare_interface是带有接口的文件

代码语言:javascript
复制
$ IFS=$'*' && array=($(cat test_compare_interface_sed))
$ echo ${array[4]}

interface GigabitEthernet1/0/4
 srr-queue bandwidth share 10 10 60 20
 priority-queue out 
 mls qos trust dscp

使用关联数组循环,我仍然很怀疑。

代码语言:javascript
复制
while IFS='*' read -r interface value; do array[$interface]=$value ; done < test_compare_interface_sed 

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-20 09:22:46

请您试一试:

代码语言:javascript
复制
declare -A array

# assign "${val[*]}" to the assciative array "array" keying with $1
store() {
    if [[ -n $1 ]]; then        # will skip the 1st line which is not ready
        array[$1]=$(IFS=$'\n'; echo "${val[*]}")
                                # join "val" with newline
        unset val               # empty the queue
    fi
}

while IFS= read -r line; do
    if [[ $line =~ ^interface ]]; then
        store "$interface"      # assign to the associative array
        interface="$line"       # for the next iteration
    else
        val+=("${line# }")      # append to the queue
    fi
done < file.txt

store "$interface"              # flush the last entry

for i in "${!array[@]}"; do     # print the array elements to test
    echo "$i"
    echo "${array[$i]}"
done

IFS.

  • If --行以“”开头,它将队列(数组val)刷新到关联数组中,并为下一次迭代更新接口名称。如果该行不以“接口”开头,则在队列中累积行(数组
  • )。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60314554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档