使用awk进行循环和值更改

时间:2014-01-22 20:45:44

标签: for-loop awk

我有以下文件格式

...
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之后的值,并且应该对许多值进行替换。

如何实现这一目标?

2 个答案:

答案 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