2017-04-01 13 views
0

私は分子座標ファイルで作業しています。最初の行は空白行の後に続く行で、各行は指定された原子のx、y、z座標の後に続きます。ファイルの一部分のみでreadarray/mapfileを使用するにはどうすればよいですか?

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行目まで要素を作成したいだけです。これらのコマンドの範囲を与える方法はありますか?

+0

提供された回答のいずれかが有用な場合は、それらをアップアップして、あなたの質問に最もよく合ったものとして受け入れてください。 http://stackoverflow.com/help/someone-answersを参照してください。 – miken32

答えて

0

構文はシンプルですが、行は配列に分割されないことに注意してください。出力は1次元配列になります。各行は配列要素です。

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

は、2次元配列を作成するために

O 0 -0.1 -1.5 

を与えるいくつかの追加のコードが必要ですが、あなたは逐次プログラムを持っている場合、必要なときに、しかし、あなたはそれぞれの行を分割することができます。

別のアプローチは、(例えばsed -n '3,10p' file)あなたが興味を持っているライン用の入力ファイルをフィルタリングしている

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 rangeを使用してsedに必要な行番号のみを印刷させます。それをループに送ります。ここではdeclareを使用して変数名の配列を作成します。

関連する問題