我有
之类的块<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>
替换为所需的值。逻辑非常直接。搜索模式,获取旁边的行,检查第一和第二列值是否为预期的4
和1
,并替换第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