2017-04-01 27 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

語法很簡單,但是請注意,行不會被拆分成數組,輸出將是一維數組,每行都是數組元素。

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

會給

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來創建具有變量名稱的數組。

相關問題