【问题标题】:bash: split text file at braces into arraybash:将大括号处的文本文件拆分为数组
【发布时间】:2013-11-07 15:42:15
【问题描述】:

我非常彻底地搜索了该网站,但无法找到合适的答案 - 很可能我没有问正确的问题。

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

[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 

我想要实现的是将文件拆分为括号中数字的数组。这样我就可以将括号中的数字用作数组索引,并将以下几行用作相应的值。

下一步将遍历数组,将每个元素提供给另一个程序。如果有更优雅的方法我愿意听。

一切顺利!

【问题讨论】:

  • 您在寻找二维数组吗? Bash 不支持这一点。或者,我们可以为每个索引创建一个字符串,其中行由\n 分隔。你真的要同时在内存中存储几千行吗?
  • 我考虑了存储它的位置,平均而言我们谈论的是 200 行。最大值约为 4000 行,这种情况很少见。

标签: arrays bash split text-files


【解决方案1】:

您可以使用 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

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

【讨论】:

  • 好主意,尽管我认为使用 RS='\\[[0-9]+\\]' 单个 gawk 会更简单
  • glenn hackman,感谢您提供的 sed 示例。我知道我在哪里做错了。
【解决方案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

希望有帮助!

【讨论】:

  • 很好解释的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多