我有一个文本文件
-7.9 8.5 1235 125478.30 9632
32656.12 0.0 0.0 2365.12 h
254 3365 12543 kk l423
我的目标是用另一个变量替换发生在2365.12处的位置。 这将在循环中发生,从而产生更多的迭代次数。
最初,我使用sed替换了引用值。但是我遇到了问题。同一行之前可能存在相同的值。但是我恰好希望替换该值的位置。
因此,我使用了以下命令,该命令会将要替换的位置计算在内。
sed -i"3s/^\(.\{32\}\)\(.\{7\}\)\(.*\)/1$variable\3" outputdata.txt
现在我的问题是,当一个循环中位数较少的值被替换时,以下值接近。因此,在下一个循环中,位置计数会与下一个值混淆。
因此,如果有人可以通过某种方式帮助我,那将真是太好了 我可以替换只有非空间的一组位置 或在每次替换时,将以下值集或行的其余部分替换为前面的空格。或其他可以指向该值并替换它的方法。
分隔值的空格数可以不同。
答案 0 :(得分:2)
如果我正确理解了您的问题,那么您正在寻找的是这个问题:
$ awk -v myvariable='XXXXX' '{ if( $4 == "2365.12" ) { $4 = myvariable }; print $0}' input.txt
-7.9 8.5 1235 125478.30 9632
32656.12 0.0 0.0 XXXXX h
254 3365 12543 kk l423
请告诉我是否有帮助。
此外,如果您希望在特定的行中进行此操作,则可以使用:
awk -v myvariable='XXXXX' '{ if( $4 == "2365.12" && NR == 2 ) { $4 = myvariable }; print $0}' input.txt
其中NR是行号。
答案 1 :(得分:1)
仅使用printf
,例如:
$ for x in 1 1000; do echo "foo [$(printf '%7s' $x)] bar"; done
foo [ 1] bar
foo [ 1000] bar
对于您而言,这意味着将$variable
替换为$(printf '%7s' $variable)
。