我对网站进行了非常彻底的搜索,但未能找到合适的答案 - 很可能我没有问正确的问题。
我有一个文本文件,最多有几千行坐标格式,如下例所示:
[1]
-75.4532 75.8273
-115.00 64.5
-90.00 74.3333
-100.00 72.4167
-110.00 69.00
-120.8 56.284
[2]
-70.00 73.75
-100.00 69.3333
-110.00 65.1533
-90.00 71.5833
-80.00 73.00
[3]
-100.00 67.5
-67.7133 72.6611
-80.00 71.5
-90.00 70.00
-110.00 63.8667
-115.8 60.836
我想要实现的是将文件拆分为括号中数字的数组。这样我就可以使用括号中的数字作为数组索引,将以下行作为相应的值。
下一步是循环遍历将每个元素提供给另一个程序的数组。如果有一种更优雅的方法,我愿意倾听。
一切顺利!
答案 0 :(得分:2)
您可以使用sed将文件按摩到bash数组定义中:
declare -a "$(sed 's/\[/" &/g; s/\]/&="/g' file | sed '1s/^"/arr=(/; $s/$/")/')"
echo "${arr[2]}"
echo
echo ${arr[2]}
-70.00 73.75
-100.00 69.3333
-110.00 65.1533
-90.00 71.5833
-80.00 73.00
-70.00 73.75 -100.00 69.3333 -110.00 65.1533 -90.00 71.5833 -80.00 73.00
使用和不使用引号打印以显示差异
答案 1 :(得分:2)
使用read -d
(设置记录分隔符)和IFS
(设置字段分隔符)的组合:
# read content from file
content="$(<input_filename)"
# append record separator to avoid dropping the last record
content="$content["
# read into array
arr=()
while IFS=']' read -d '[' sub value; do
arr[$sub]=$value
done <<<"$content"
结果数组将有一个空的第一个元素,因为它是从零开始的。这可能使循环它变得更加棘手。您可以显式删除第一个元素以使循环更容易:
unset arr[0]
现在你可以遍历元素:
for value in "${arr[@]}"; do
program < "$value"
done
或者如果您还需要基于1的索引:
for ((i=1; i<=${#arr[@]}; i++)); do
program "$i" "$value"
done
希望有所帮助!