如何在使用它来过滤awk中的块时保留RS

时间:2018-02-05 13:21:17

标签: awk

我有以下数据,这些数据是块的形式。每个块由两种字符串分隔:

  
      
  1. SEP1
  2.   
  3. SEP2
  4.   

以下是输入数据:

echo "$y"
sep1
abc
def
ghi
sep2
jkl
mno
sep1
pqr
sep2
stu
sep1
vwx
sep2
yz
sep1

假设我要删除包含abc的块:我使用了以下命令:

echo "$y" |awk -v RS='sep1|sep2' '!/abc/'


jkl
mno


pqr


stu


vwx


yz

它工作但删除了原始的seprator。我如何保留它,以便输出如下:

sep1

sep2
jkl
mno
sep1
pqr
sep2
stu
sep1
vwx
sep2
yz
sep1

2 个答案:

答案 0 :(得分:2)

另一个去。使用GNU awk和RT

$ awk 'BEGIN{RS="(sep1|sep2)\n"}/abc/{$0="\n"}{ORS=RT;print}' file
sep1
      # only 1 empty line like in the expected output
sep2
jkl
...

文档提及RT

每次读取记录时都会设置

RT。它包含与记录分隔符RS表示的文本匹配的输入文本。这个变量是一个gawk扩展。

答案 1 :(得分:2)

通过块处理(没有RS模式):

awk '/sep[12]/{ if (r) print (r !~ /abc/? r : ""); print $0; r=""; next }
     { r=(r? r ORS : "")$0 }' file
  • if (r) print (r !~ /abc/? r : "") - 打印上一个块内容(如果它存在且不包含abc
  • r=(r? r ORS : "")$0 - 累积每个块行

输出:

sep1    

sep2
jkl
mno
sep1
pqr
sep2
stu
sep1
vwx
sep2
yz
sep1