如何在bash编程中更新类似矩阵的数据(.txt)文件?
我是bash编程新手。我有这个文件,该文件包含:如何在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可以直接调用
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。