Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays bash:将大括号处的文本文件拆分为数组_Arrays_Bash_Split_Text Files - Fatal编程技术网

Arrays bash:将大括号处的文本文件拆分为数组

Arrays bash:将大括号处的文本文件拆分为数组,arrays,bash,split,text-files,Arrays,Bash,Split,Text Files,我对网站进行了彻底的搜索,但没有找到合适的答案——很可能我没有提出正确的问题 我有一个文本文件,其中包含多达数千行的坐标,格式如下例所示: [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

我对网站进行了彻底的搜索,但没有找到合适的答案——很可能我没有提出正确的问题

我有一个文本文件,其中包含多达数千行的坐标,格式如下例所示:

[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 
我试图实现的是将文件拆分为括号中数字处的数组。因此,我可以使用括号中的数字作为数组索引,以下几行作为相应的值

下一步是在数组中循环,将每个元素提供给另一个程序。如果有更优雅的方法,我愿意倾听


祝你一切顺利

您可以使用sed将文件转换为bash数组定义:

declare -a "$(sed 's/\[/" &/g; s/\]/&="/g' file | sed '1s/^"/arr=(/; $s/$/")/')"
echo "${arr[2]}"
echo
echo ${arr[2]}

带引号和不带引号打印以演示差异

您可以使用sed将文件转换为bash数组定义:

declare -a "$(sed 's/\[/" &/g; s/\]/&="/g' file | sed '1s/^"/arr=(/; $s/$/")/')"
echo "${arr[2]}"
echo
echo ${arr[2]}

带引号和不带引号打印以演示差异

使用
read-d
(设置记录分隔符)和
IFS
(设置字段分隔符)的组合:

现在,您可以在元素上循环:

for value in "${arr[@]}"; do
    program < "$value"
done
用于“${arr[@]}”中的值;做
计划<“$value”
完成
或者,如果您还需要基于1的索引:

for ((i=1; i<=${#arr[@]}; i++)); do
    program "$i" "$value"
done

for((i=1;i使用
read-d
(设置记录分隔符)和
IFS
(设置字段分隔符)的组合:

现在,您可以在元素上循环:

for value in "${arr[@]}"; do
    program < "$value"
done
用于“${arr[@]}”中的值;do
计划<“$value”
完成
或者,如果您还需要基于1的索引:

for ((i=1; i<=${#arr[@]}; i++)); do
    program "$i" "$value"
done

用于((i=1;i您是在寻找一个二维数组吗?Bash不支持该功能。或者,我们可以为每个索引创建一个字符串,每行之间用
\n
分隔。您真的想同时在内存中存储几千行吗?我考虑了存储它的位置,平均我们讨论的是200行。最大值为大约是4000行,这是一种罕见的情况。您正在寻找一个二维数组吗?Bash不支持。或者,我们可以为每个索引创建一个字符串,其中的行由
\n
分隔。您真的想同时在内存中存储几千行吗?我考虑了存储它的位置,平均而言,我们将我说的是200行。最多大约4000行,这是一个罕见的现象。好主意,尽管我认为使用
RS=\\[[0-9]+\\]'会更简单。
glenn hackman,谢谢你的sed示例。我知道我犯了什么错误。尽管我认为使用
RS=\\\[[0-9]会更简单,但这是个好主意+\\]“
glenn hackman,谢谢你的sed示例。我明白我的错误所在。答案解释得很好。谢谢!答案解释得很好。谢谢!