我有像
这样的街区<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?但在我的情况下不是很有帮助(我的列是空格分隔的)。如果这已经可能重复,请提前抱歉...
答案 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>
。逻辑非常简单。搜索模式,获取旁边的行,检查第一列和第二列值是否为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