如何在文件的一部分上使用readarray / mapfile?

时间:2017-04-01 02:38:41

标签: arrays bash unix range lines

我正在处理分子坐标文件,其中第一行是原子数,后跟一个空行,每行后面是给定原子的x,y和z坐标。

7

O    0    -0.1   -1.5
H    0     0.8   -1.9
H    0     0.1   -0.5
N    0     0      1.5
H    0    -1      1.7
H   -0.8   0.4    1.9
H    0.8   0.4    1.9

我想创建一个数组,其中每个元素都是文件的一行,所以它看起来像这样:

r1=(O    0    -0.1   -1.5)
r2=(H    0     0.8   -1.9)

我会使用readarraymapfile命令,但我只想从第3行到第10行创建元素。有没有办法给这些命令范围?

2 个答案:

答案 0 :(得分:0)

语法很简单,但请注意,这些行不会被拆分为数组,输出将是一维数组,其中每一行都是数组元素。

readarray -s 2 arr < file
echo ${arr[0]}

将给出

O 0 -0.1 -1.5

创建一个二维数组需要一些额外的代码,但如果你有一个顺序程序,你可以在需要时拆分每一行。

另一种方法是过滤您感兴趣的行的输入文件(例如sed -n '3,10p' file

答案 1 :(得分:0)

这似乎对我有用,虽然我确定它不是最有效的:

#!/bin/bash

i=0
while read line; do
    i=$((i + 1))
    declare -a "r$i"="($line)"
done < <(sed -n '3,10p' coords.txt)

# do stuff with $r1, $r2, etc    
echo "${r1[@]}"
echo "${r2[@]}"
echo "${r3[@]}"
echo "${r4[@]}"
echo "${r5[@]}"
echo "${r6[@]}"
echo "${r7[@]}"

我们使用address rangesed仅打印所需的行号。将其输入循环,我们使用declare创建一个具有变量名称的数组。