如何在bash编程中更新类似矩阵的数据(.txt)文件?

如何在bash编程中更新类似矩阵的数据(.txt)文件?,bash,programming-languages,Bash,Programming Languages,我是bash编程新手。我有这个文件,该文件包含: A B C D E 1 X 0 X 0 0 2 0 X X 0 0 3 0 0 0 0 0 4 X X X X X 其中X表示有值,0表示为空 从这里开始,假设用户输入B3,这是一个0,意味着我需要将其替换为X。最好的方法是什么?我需要不断更新这个文件 仅供参考:这是一个家庭作业问题,因此请不要直接给出代码/答案。但任何示例代码,如如何使用此函数等,都将非常感谢 问候, 新手Bash编剧 编辑: 如果我没有错,Bash可以直接调用

我是bash编程新手。我有这个文件,该文件包含:

   A B C D E
 1 X 0 X 0 0
 2 0 X X 0 0
 3 0 0 0 0 0
 4 X X X X X
其中X表示有值,0表示为空

从这里开始,假设用户输入B3,这是一个0,意味着我需要将其替换为X。最好的方法是什么?我需要不断更新这个文件

仅供参考:这是一个家庭作业问题,因此请不要直接给出代码/答案。但任何示例代码,如如何使用此函数等,都将非常感谢

问候,

新手Bash编剧

编辑:


如果我没有错,Bash可以直接调用/更新特定列。可以用行+列来完成吗?

一些让您开始的东西

#!/bin/bash
# call it using ./script B 1
# make it executable using "chmod 755 script"

# read input parameters

col=$1
row=$2

# construct below splits on whitespace
while read -a line
do
    for i in ${line[@]}; do
        array=( "${array[@]}" $i );
    done
done < m

# Now you have the matrix in a one-dimensional array that can be indexed.

# Lets print it

for i in ${array[@]}; do
    echo $i;
done

一些能让你开始的东西

#!/bin/bash
# call it using ./script B 1
# make it executable using "chmod 755 script"

# read input parameters

col=$1
row=$2

# construct below splits on whitespace
while read -a line
do
    for i in ${line[@]}; do
        array=( "${array[@]}" $i );
    done
done < m

# Now you have the matrix in a one-dimensional array that can be indexed.

# Lets print it

for i in ${array[@]}; do
    echo $i;
done
如果你能使用sed,我将抛出以下花絮:

sed -i "/^2/s/. /X /4" /path/to/matrix_file
输入 输出 解释 ^2:这将限制sed仅在以2开头的行上工作,即第二行

s:这是替换命令

注意,对于接下来的两个例子,“u1”表示一个空白

.这是要匹配的模式。这个是匹配任何字符的正则表达式,因此。\匹配后跟空格的任何字符。请注意,这也可能是[0X]\如果您保证只能有两个字符“0”和“X”

这是替换文本。在本例中,我们将如上所述的“任意字符后跟空格”替换为“X后跟空格”

4:这与上面模式文本的第四个匹配,即第四行,包括行索引

剩下你要做的就是在^2和4的位置使用变量,比如^$row和$col,然后将字母A-E映射到1-5

sed -i "/^2/s/. /X /4" /path/to/matrix_file
输入 输出 解释 ^2:这将限制sed仅在以2开头的行上工作,即第二行

s:这是替换命令

注意,对于接下来的两个例子,“u1”表示一个空白

.这是要匹配的模式。这个是匹配任何字符的正则表达式,因此。\匹配后跟空格的任何字符。请注意,这也可能是[0X]\如果您保证只能有两个字符“0”和“X”

这是替换文本。在本例中,我们将如上所述的“任意字符后跟空格”替换为“X后跟空格”

4:这与上面模式文本的第四个匹配,即第四行,包括行索引


您需要做的是在^2和4的位置使用变量,例如^$row和$col,然后将字母A-E映射到1-5

awk -v col=B -v row=3 'BEGIN{getline; for (i=1;i<=NF;i++) cols[$i]=i+1} NR==row+1{print $cols[col]}'

i+1和行+1分别代表行标题和列标题。

这里是使用AWK的入门:

awk -v col=B -v row=3 'BEGIN{getline; for (i=1;i<=NF;i++) cols[$i]=i+1} NR==row+1{print $cols[col]}'

i+1和行+1分别代表行标题和列标题。

我认为您需要重新格式化输入数据iegex,这是什么意思?这意味着,我应该将其改为“仅行”,而不是“行”?这必须是直接的Bash还是可以调用sed或awk之类的外部程序?我认为您需要重新格式化输入数据iegex,这是什么意思?也就是说,我应该将其改为“仅行”,而不是“行”?这必须是直接的Bash还是可以调用sed或awk之类的外部程序?您还可以执行array+=$I。您还可以执行array+=$I。