我有一个文本文件(A.txt),如:
A B C D
.
.
SS (ii)
.
A B C D
.
.
.
.
A B C D
如果模式“SS(ii)”出现在“A B C D”之后的第三行中,我想将新值(例如BB)分配给匹配“A B C D”的记录的第二个字段。类似的东西:
A BB C D
.
.
SS (ii)
.
A B C D
.
.
.
.
A B C D
答案 0 :(得分:1)
awk '{a[NR]=$0}END{for(i=1;i<=NR;i++)
if(a[i]~/SS \(ii\)/ && a[i-3]~/A B C D/)
sub(/B/,"BB",a[i-3]);for(i=1;i<=NR;i++)print a[i]}' file
这应该做。
请注意
sub(/B/,"BB..)
等。SS \(..)
行号,第二次检查并更新该行。选择你喜欢的方式。答案 1 :(得分:1)
这是一种方法:
awk 'FNR==NR {if (/A B C D/) f=NR; if ($0~/SS \(ii\)/ && f && NR==f+3) {h[NR-3]=1;f=""};next} h[FNR] {$2="BB"}1' file{,}
A BB C D
.
.
SS (ii)
.
A B C D
.
.
.
.
A B C D
答案 2 :(得分:0)
awk 'NR==FNR{if (/SS \(ii\)/) ss[NR]++; next} /A B C D/ && ss[FNR+3]{$2=BB} 1' file file