我有以下文件格式
...
MODE P E
IMP:P 1 19r 0
IMP:E 1 19r 0
...
SDEF POS= 0 0 14.6 AXS= 0 0 1 EXT=d3 RAD= d4 cell=23 ERG=d1 PAR=2
SI1 L 0.020
SP1 1
SI4 0. 3.401
SI3 0.9
...
NPS 20000000
我要做的是找到一个特定的值(特别是序列SI1 L
之后的值)并创建一系列具有不同值的文件。例如ST1 L 0.020
---> ST1 L 0.050
。我想到的是给出一个起始值,一个结束值和一个步骤,以便在序列SI1 L
之后生成具有不同值的文件。例如,for循环可以工作,但我不知道如何在awk
之外使用它。
我可以使用
找到值awk '$1=="SI1" {printf "%12s\n", $3}' file
我还可以使用以下内容替换值
awk '$1=="SI1" {gsub(/0.020/, "0.050"); printf "%12s\n", $3}' file
问题是价值不会总是0.020
。这就是为什么我需要一种方法来替换序列SI1 L
之后的值,并且应该对许多值进行替换。
如何实现这一目标?
答案 0 :(得分:1)
您可以尝试:
awk -vval="0.05" '$1=="SI1"{$3=val}1' file
这将在输入文件中将SI1 L 0.020
替换为SI1 L 0.05
。
然后使用bash脚本在for循环中调用awk程序..
例如:
#! /bin/bash
vals=(0.02 0.03 0.04 0.05)
i=0
for val in "${vals[@]}"; do
i=$(($i+1))
awk -vval="$val" '$1=="SI1"{$3=val}1' file > "file${i}"
done
答案 1 :(得分:1)
如果你的系统有seq命令,这里有更简单的脚本。
for val in $(seq 0.02 0.01 0.05)
do
awk -vval="$val" '/SI1 L/{$3=val}1' file > "${val}"
# or Using sed
# sed: sed "s/SI1 L .*/SI1 L $val/" > "${val}"
done