我有以下数据,这些数据是块的形式。每个块由两种字符串分隔:
- SEP1
- SEP2
醇>
以下是输入数据:
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
答案 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