我有这样的文本文件:
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)
答案 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)