代码之家  ›  专栏  ›  技术社区  ›  learningHappily

Bash-从文件填充2D阵列

  •  1
  • learningHappily  · 技术社区  · 10 年前

    我知道这可能是件容易的事,但我真的很难做到这一点。

    问题描述: 我有一个坐标格式的文本文件:
    1 2
    3 7 ...
    其中第一列==“x”,第二列==”y“坐标。
    现在我想通过打印文件中指定的点的“x”和“”,使用文件中的坐标填充一个大小为N x M的2D数组否则

    示例:数组[1][2]=“X”,数组[3][7]=“X’,数组[0][1]=“。”

    到目前为止,我已经尝试过:

    1. 分离x、y列并将它们存储在数组中,如下所示:

      xcoords="xcoords.txt"
      ycoords="ycoords.txt"
      
      head $geneFile | grep " " | awk -F' ' '{print $1}' > $xcoords
      head $geneFile | grep " " | awk -F' ' '{print $2}' > $ycoords
      
      readarray -t xarr < $xcoords
      readarray -t yarr < $ycoords
      

    但无法从这里真正移动(最终无法使用3,4嵌套for循环)。

    1. 或者只是将文件存储在2D阵列中。但由于bash不支持2D阵列(我知道有一些方法可以模拟它,但不知道在这种情况下如何使用它)

      readarray -t array < $geneFile # 
      

    这样的循环会很好-当然,我希望得到类似“${xarr[I]}”的值,而不是固定值。

        for (( i = 0; i < nRows; i++ )); do
            for (( j = 0; j < nColumns; j++ )); do
                if [[ $i == 5 ]] && [[ $j == 5 ]]; then # of course instead of fixed value here I'd like to get coordinates values.
                    printf "O"
                else
                    printf "."
                fi
            done
            printf "\n"
        done 
    

    如何实现这一目标,有什么建议/例子吗?提前感谢!

    1 回复  |  直到 10 年前
        1
  •  0
  •   gniourf_gniourf    10 年前

    有一种简单的方法来编码二维大小数组 M N 成一维大小的数组 M*N 例如:

    A[p,q] ↔ B[p+q*M]
    

    对于我们的任务:我们将修复 M N 从一开始,将所有数组项设置为 . 然后读取文件以将相应字段设置为 X :

    #!/bin/bash
    
    M=10
    N=10
    
    [[ $1 && -f $1 && -r $1 ]] || { printf >&2 'arg must be readable file.\n'; exit; }
    geneFile=$1
    
    array=()
    for ((i=0; i<M*N; ++i)); do
        array+=( '.' )
    done
    
    while read -r x y; do
        [[ $x && $y ]] || continue
        [[ $x = +([[:digit:]]) && $y = +([[:digit:]]) ]] || continue
        ((x=10#$x,y=10#$y))
        (( x<M && y<N )) || continue
        array[x+y*M]=X
    done < "$geneFile"
    
    # print to stdout
    for((i=0;i<N;++i)); do
        printf '%s' "${array[@]:i*M:M}" $'\n'
    done
    

    对于您的数据,输出为:

    ..........
    ..........
    .X........
    ..........
    ..........
    ..........
    ..........
    ...X......
    ..........
    ..........
    

    在这种情况下,另一种可能是使用字符串而不是数组(详细信息留给读者或其他回答者)。

    注意:读取文件的循环会自动丢弃格式错误的行。