二维数组文件拆分和检索| bash

二维数组文件拆分和检索| bash,bash,Bash,文件是这样的 ATOM 1 HO5' C 1 3.429 -7.861 3.641 1.00 0.00 H ATOM 2 O5' C 1 4.232 -7.360 3.480 1.00 0.00 O ATOM 3 C5' C 1 5.480 -8.064 3.350 1.00 0.00 C

文件是这样的

ATOM      1 HO5'   C     1       3.429  -7.861   3.641  1.00  0.00           H  
ATOM      2  O5'   C     1       4.232  -7.360   3.480  1.00  0.00           O  
ATOM      3  C5'   C     1       5.480  -8.064   3.350  1.00  0.00           C  
ATOM      4  H5'   C     1       5.429  -8.766   2.518  1.00  0.00           H  
我想将它们存储到2D数组中,使用值进行一些计算,然后检索 我声明数组如下:

readarray row < sample.pdb

IFS=' \t\r\n' read -a cell <<< "$row"

    for (( r = 0; r <= ${#row[@]}; r++ ))      # row
    do

      for (( c = 0 ; c <= ${#cell[@]}; c++ )) #cells
        do
             echo ${cell[$c]}

            declare -A matrix[$r,$c]="${cell[$c]}"

        done

    done
我将文件拆分如下:

readarray row < sample.pdb

IFS=' \t\r\n' read -a cell <<< "$row"

    for (( r = 0; r <= ${#row[@]}; r++ ))      # row
    do

      for (( c = 0 ; c <= ${#cell[@]}; c++ )) #cells
        do
             echo ${cell[$c]}

            declare -A matrix[$r,$c]="${cell[$c]}"

        done

    done
但输出是第一行,重复一次又一次

原子 1. HO5' A. 1. 3.429 -7.861 3.641 1 0 H

原子 1. HO5' A. 1. 3.429 -7.861 3.641 1 0 H

我想知道适当的二维分割。

Bash没有多维数组

假装用作多维数组的关联数组:

这个代码有效

readarray row < file.pdb

declare -A matrix
IFS=' \t\r\n' read -a cell <<< $row


num_rows=${#row[@]}
num_cells=${#cell[@]}

echo ${#row[@]}
echo ${#cell[@]}

for ((i=0; i<num_rows; i++)) do

IFS=' \t\r\n' read -a cell <<< ${row[$i]}

    for ((j=0; j<num_cells; j++)) do
    
       
        matrix[$i,$j]=${cell[$j]}
    done
done

f1=" %5s"
f2="%$((${#num_rows}+1))s"


for ((i=0;i<=num_rows;i++)) do

    
    for ((j=0;j<=num_cells;j++)) do
    
        printf "$f1" ${matrix[$i,$j]}
        
    done
    echo
done

一个好的起点是使用declare-p矩阵打印数组的当前状态。如果内容加载正确,则可以删除尝试加载的代码,并仅使用该内容询问问题。如果加载错误,您可以删除所有试图读取内容的代码,只关注加载问题。无论哪种方式,问题都可以而且应该集中在一个特定的、狭窄的问题上……您可以在输出的底部看到显示declare-p矩阵结果的代码;但是,如果不知道你的逻辑背后的原理和意图是什么,是否正确,为什么正确与否,这并不明显。坦率地说,如果不充分解释为什么输出应该是正确的,仅仅拥有你的预期输出是没有多大帮助的。echo${matrix[$i,$j]}永远不会在同一行中放置多个单元格,因此没有理由期望代码打印您所声明的预期输出。这是一个名为.pdb的文件格式,用于存储化学分子动力学数据,原子应该是行中的第一个项,它丢失了,无法找出原因。printf样本上的参数没有帮助。对于shells printf,使用iis printf%sFMTSTR%setc%detc\n$1$2$3。或者你的意思是使用awk,它可以接受printf,并且是解决这个问题的好工具。请注意,$1 etc是cmd行参数,而不是数据文件中的字段。祝你好运
readarray row < file.pdb

declare -A matrix
IFS=' \t\r\n' read -a cell <<< $row


num_rows=${#row[@]}
num_cells=${#cell[@]}

echo ${#row[@]}
echo ${#cell[@]}

for ((i=0; i<num_rows; i++)) do

IFS=' \t\r\n' read -a cell <<< ${row[$i]}

    for ((j=0; j<num_cells; j++)) do
    
       
        matrix[$i,$j]=${cell[$j]}
    done
done

f1=" %5s"
f2="%$((${#num_rows}+1))s"


for ((i=0;i<=num_rows;i++)) do

    
    for ((j=0;j<=num_cells;j++)) do
    
        printf "$f1" ${matrix[$i,$j]}
        
    done
    echo
done
4
11
  ATOM     1  HO5'     A     1 3.429 -7.861 3.641  1.00  0.00     H      
  ATOM     2   O5'     G     1 4.232 -7.360 3.480  1.00  0.00     O      
  ATOM     3   C5'     C     1 5.480 -8.064 3.350  1.00  0.00     C      
  ATOM     4   H5'     U     1 5.429 -8.766 2.518  1.00  0.00     H