当前一列与模式匹配时,替换空格分隔列中的第N列

时间:2016-06-14 16:28:06

标签: bash

我有像

这样的街区
<block>
 6   3  0.3464400E-01  0.4497077E+03  0.7546771E-02  0.1037429E+00
       21   -1    0    0  501  502  0.00000000000E+00  0.00000000000E+00  0.27717368685E+03  0.27717368685E+03  0.00000000000E+00 0.  1.
 </block>

但也

<block>
 4   1  0.3464400E-01  0.3573334E+03  0.7546771E-02  0.1068535E+00
        6    1    1    2  501    0 -0.28596283579E+03 -0.12710688463E+03  0.60083326400E+02  0.36234949936E+03  0.17250000000E+03 0. -1. 
</block>

我需要的是,只看到&#34;块&#34;之后的第一行。并且只有当&#34; 4 1&#34; pattern为true,然后用另一个数字替换4rth列,但所有其他行应保持不变。我发现这个How to replace the nth column/field in a comma-separated string using sed/awk?但在我的情况下不是很有帮助(我的列是空格分隔的)。如果这已经可能重复,请提前抱歉...

2 个答案:

答案 0 :(得分:1)

我想你想改变这个:

<block>
 4   1  0.3464400E-01  0.3573334E+03

到此:

<block>
 4   1  0.3464400E-01  <something else>

awk是一个很好的工具。这是一种方法:

awk '{
  if($1 == "<block>"){
    block_row=NR
  }
  else if(block_row>0 && NR == block_row+1 && $1 == 4 && $2 == 1){
    $4 = "<something>"
  }
  print $0
}' infile > outfile

mv -f outfile infile

答案 1 :(得分:1)

假设您有值可供替换,您只需使用awk

即可
awk '/<block>/ { getline;  if (($1=="4") && ($2=="1")) {$4=<value>;print} }' file
#                                                           ^Value to be replaced

在上面的表达式中,用您需要的值替换<value>。逻辑非常简单。搜索模式,获取旁边的行,检查第一列和第二列值是否为41,并替换第4列的值。

假设你有一个如下文件: -

$ cat file

<block>
4   1  0.3464400E-01  0.3573334E+03  0.7546771E-02  0.1068535E+00
6    1    1    2  501    0 -0.28596283579E+03 -0.12710688463E+03  0.60083326400E+02  0.36234949936E+03  0.17250000000E+03 0. -1.
</block>
<block>
4   2  0.3464400E-01  0.3573334E+03  0.7546771E-02  0.1068535E+00
6    1    1    2  501    0 -0.28596283579E+03 -0.12710688463E+03  0.60083326400E+02  0.36234949936E+03  0.17250000000E+03 0. -1.
</block>

我正在运行命令,其替换值为0

$ awk '/<block>/ { getline;  if (($1=="4") && ($2=="1")) {$4=0;print} }' file
4 1 0.3464400E-01 0 0.7546771E-02 0.1068535E+00