循环遍历文件中的匹配并在匹配后对字段执行算术运算

时间:2018-03-13 19:47:32

标签: loops awk

我有一个包含类似于以下行的100次出现的文件:

   X201
   99.12c   9.8360E-05
   120.50c  1.0550E-05
   145.99c  2.7650E-05
   X202
   89.12c   2.8360E-05
   120.50c  8.7550E-05
   345.99c  5.6650E-05

我需要在乘以某个分数后立即用字段的值替换每个出现的120.50c。因此,对于第一次匹配120.50c,我需要将字段1.0550E-05乘以0.79,0.10和0.11。

因此120.50cX201之间的X202匹配120.50c 1.0550E-05,我需要用以下三行替换整行:

   120.39c  8.3345E-06
   120.40c  1.0550E-06
   120.41c  1.1605E-06

120.39c, 120.40c120.41c将是我指定的字符串,用于120.50c的每个匹配。由于每个120.50c之后的值不同,我无法进行简单的查找和替换。

运行脚本后,我想结束以下输出。

   X201
   99.12c   9.8360E-05
   120.39c  8.3345E-06
   120.40c  1.0550E-06
   120.41c  1.1605E-06
   145.99c  2.7650E-05
   X202
   89.12c   2.8360E-05
   120.39c  6.9165E-05
   120.40c  8.7550E-06
   120.41c  9.6305E-06
   345.99c  5.6650E-05

我一直用awk与它战斗,无法让它发挥作用。我想我可能需要使用Perl或Python。提前谢谢。

1 个答案:

答案 0 :(得分:2)

awk救援!

$ awk 'BEGIN{n=split("0.79 0.10 0.11",coeff)} 
            {key="120.50c"; c=39; 
             if($1==key) 
               for(i=1;i<=n;i++) 
                 {sub(50,c++,key); 
                  printf "%s\t%.4e\n", key, $2*coeff[i]; key=$1} 
             else print}' file | column -t
X201
99.12c   9.8360E-05
120.39c  8.3345e-06
120.40c  1.0550e-06
120.41c  1.1605e-06
145.99c  2.7650E-05
X202
89.12c   2.8360E-05
120.39c  6.9164e-05
120.40c  8.7550e-06
120.41c  9.6305e-06
345.99c  5.6650E-05