Bash - 从文件填充2D数组

时间:2015-02-21 12:45:45

标签: arrays bash conways-game-of-life

我知道这可能很容易,但我真的很难挣扎。

问题描述: 我有一个格式为坐标的文本文件:
1 2
3 7 ...... 第一栏==' x'和第二栏==' y'坐标。
现在我想通过打印' X'来使用文件中的坐标来填充大小为N x M的2D数组。对于在文件和'中指定的点数。'除此以外。

示例:array [1] [2] =' X',array [3] [7] =' X',array [0] [1] =&#39 ;'

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

  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
    
  2. 但是真的无法从这里移动(最终没有工作3,4嵌套for循环)。

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

      readarray -t array < $geneFile # 
      
    2. 像这样的循环会很棒 - 当然不是固定的价值我喜欢得到类似&#34; $ {xarr [i]}&#34;。

          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 个答案:

答案 0 :(得分:0)

有一种简单的方法可将大小为M×N的二维数组编码为大小为M*N的1维数组,例如:

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

对于我们的任务:我们将从头开始修复MN,将所有数组术语设置为.,然后读取文件以将相应字段设置为{{ 1}}:

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

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

注意:以静默方式读取文件的循环会丢弃格式错误的行。