使用AWK根据下一行中的模式更改行中的字段值

使用AWK根据下一行中的模式更改行中的字段值,awk,text-processing,Awk,Text Processing,我有一个文本文件(a.txt),如: 如果模式“SS(ii)”出现在“a B C D”之后的第三行中,我想为与“a B C D”匹配的记录的第二个字段分配一个新值(例如BB)。比如: A BB C D . . SS (ii) . A B C D . . . . A B C D awk'{a[NR]=$0}END{for(i=1;i以下是一种方法: awk 'FNR==NR {if (/A B C D/) f=NR; if ($0~/SS \(ii\)/ && f &&a

我有一个文本文件(a.txt),如:

如果模式“SS(ii)”出现在“a B C D”之后的第三行中,我想为与“a B C D”匹配的记录的第二个字段分配一个新值(例如BB)。比如:

A BB C D
.
.
SS (ii)
.
A B C D
.
.
.
.
A B C D

awk'{a[NR]=$0}END{for(i=1;i以下是一种方法:

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

如果文件非常大怎么办?我们不是内存不足吗?@user3684042然后处理两次。我提到了它是如何工作的。(注[2])
 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
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
awk 'NR==FNR{if (/SS \(ii\)/) ss[NR]++; next} /A B C D/ && ss[FNR+3]{$2=BB} 1' file file