Bash:嵌套for循环以迭代更改矩阵中的paritular元素
我尝试在file.txt中更改格式,如下所示:Bash:嵌套for循环以迭代更改矩阵中的paritular元素,bash,awk,sed,Bash,Awk,Sed,我尝试在file.txt中更改格式,如下所示: 0.0 0.0 1.0 2.0 3.0 0.0 0.0 3.0 3.0 35.0 ... 每行中只有第二个零:从0.0到某些数字 我知道sed命令会更改元素,但如果我编写类似的内容: input=0 for f in {0..2} do sed -i "1s/$input/$f/" file.txt input=$f done sed命令更改文件中的第一个零,将其更改为: 1.0 0.0 1.0 2.0 3.0 1.0
0.0 0.0 1.0 2.0 3.0
0.0 0.0 3.0 3.0 35.0
...
每行中只有第二个零:从0.0到某些数字
我知道sed
命令会更改元素,但如果我编写类似的内容:
input=0
for f in {0..2}
do
sed -i "1s/$input/$f/" file.txt
input=$f
done
sed命令更改文件中的第一个零,将其更改为:
1.0 0.0 1.0 2.0 3.0
1.0 0.0 3.0 3.0 35.0
...
但是,我想:
0.0 0.1 1.0 2.0 3.0
0.0 0.1 3.0 3.0 35.0
...
那么,我如何指定sed必须更改数字的位置呢
升级:
我尝试使用sadasidha猜测的sed
命令:
number=0.2
sed -r "s/^([0-9].[0-9]) ([0-9].[0-9])/\1 ${number}/" input.txt
number=0.2
sed -r "s/^([0-9].[0-9]) ([0-9].[0-9])/\1 ${number}/" input.txt
但我的要求有点不同,我的想法是做一个循环,我可以在第四行增加第二个元素,例如,10倍,然后是第三行的第二个元素,然后是第二行,然后是第一个…就像在四个循环中一样:
input=0
for f in {0..10}
for m in {0..10}
for s in {0..10}
for g in {0..10}
do
change the second element on the fourth line 10 times,
input=$f
done
change the second element on the third line 10 times,
input=$m
done
....
因此,对于我放入do循环中的每个数字组合(即:0,10之间),我可以在第二行中有11^4个不同的元素值。这是
awk
的作业。默认情况下,awk
拆分空格序列([[:space:]+
)。一旦awk
读取该行,它将在默认分隔符上拆分该行,并将其分配给可以使用$
和列号引用的变量
例如:
$ cat file
0.0 0.0 1.0 2.0 3.0
0.0 0.0 3.0 3.0 35.0
我们使用$2
增加第二列的值,最后的1
允许我们打印行。您还可以将其设置为:
$ awk '{$2=($2==0?0.1:$2); print}' file
0.0 0.1 1.0 2.0 3.0
0.0 0.1 3.0 3.0 35.0
使用perl很容易
perl -lanE '$F[1]=0.1 unless $F[1]+0; say "@F"' filename
用于下一个输入
0.0 0.0 1.0 2.0 3.0
0.0 0.0 3.0 3.0 35.0
0.0 0.9 3.0 3.0 35.0
印刷品
0.0 0.1 1.0 2.0 3.0
0.0 0.1 3.0 3.0 35.0
0.0 0.9 3.0 3.0 35.0
number=0.2
sed -r "s/^([0-9].[0-9]) ([0-9].[0-9])/\1 ${number}/" input.txt