在以前的列匹配模式时,替换空间分离列中的第n列

  • 本文关键字:空间 替换 分离 模式 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>

我需要的是仅在"块"之后的第一行中查看,并且只有当" 4 1"模式为真时,然后用另一个数字替换第4列,但所有其他行都应保持不变。我发现如何使用sed/awk替换逗号分隔字符串中的n列/字段?但是在我的情况下,不是很有帮助(我的列是空间分开的)。抱歉,如果这已经可能是重复的...

我想您想更改此信息:

<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

假设您有一个可以替换的值,则可以简单地使用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

最新更新