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

时间:2014-08-26 14:17:53

标签: awk text-processing

我有一个文本文件(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

3 个答案:

答案 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