从文件创建数组并根据bash中的一行命名

时间:2019-05-22 07:21:13

标签: arrays bash

我有这样的文本文件:

    1   2   3   4   5   6   7   8

1   1399    17  4   3   0   0   0   0
2   11  374     2   3   1   4   0   1
3   7   0   187     4   0   0   1   1
4   2   3   4   308     0   0   0   3
5   2   0   0   0   280     3   0   1
6   0   2   0   0   2   81  0   3
7   1   0   2   0   2   0   154     4
8   0   0   1   2   1   1   8   552

我想要一个脚本,该脚本将创建名称为行左侧的数组,并使用行右侧的元素填充数组。所以基本上应该这样做:

src_dir=source1
src_dir=source2
dst_dir=dest1
whatever_thing=thing1
whatever_thing=thing2

到目前为止,我已经尝试过:

src_dir=(source1 source2)
dst_dir=(dest1)
whatever_thing=(thing1 thing2)

2 个答案:

答案 0 :(得分:2)

如果您的bash版本为4.3或更高版本,则declare有一个-n选项 定义对变量名称的引用,该变量名称在reference中用作C++。 然后,请尝试以下操作:

while IFS== read -r key val; do
    declare -n name=$key
    name+=("$val")
done < file.txt

# test
echo "${src_dir[@]}"
echo "${dst_dir[@]}"
echo "${whatever_thing[@]}"

答案 1 :(得分:0)

尝试一下:

#!/bin/bash
mapfile -t arr < YourDataFile.txt
declare -A dict
for line in "${arr[@]}"; do
    key="${line%%=*}"
    value="${line#*=}"
    [ ${dict["$key"]+X} ] && dict["$key"]+=" $value" || dict["$key"]="$value"
done

for key in "${!dict[@]}"; do
    printf "%s=(%s)\n" "$key" "${dict["$key"]}"
done

说明

# read file into array
mapfile -t arr < YourDataFile.txt

# declare associative array
declare -A dict

# loop over the data array
for line in "${arr[@]}"; do

    # extract key
    key="${line%%=*}"

    # extract value
    value="${line#*=}"

    # write into associative array
    #   - if key exists ==> append value
    #   - else initialize entry
    [ ${dict["$key"]+X} ] && dict["$key"]+=" $value" || dict["$key"]="$value"
done

# loop over associative array
for key in "${!dict[@]}"; do

    # print key=value pairs
    printf "%s=(%s)\n" "$key" "${dict["$key"]}"
done

输出

dst_dir=(dest1)
src_dir=(source1 source2)
whatever_thing=(thing1 thing2)