使用sed删除重复文本块

时间:2017-08-23 06:23:10

标签: sed uniq

数据看起来像这样

Para1
X12Y1
AABBAABABA
BBAAABABAB
Para2
X13Y2
ABABAABAAB
ABABABABAA
Para3
X13Y2
BBBABABABA
BABABABABA
Para4
X12Y1
BBBABABABA
BABABABABA
Para5
X20Y9
BBBABABABA
BABABABABA

如何根据X13Y2和X12Y1重复的规则删除Para3和Para 4?

所需的输出如下:

Para1
X12Y1
AABBAABABA
BBAAABABAB
Para2
X13Y2
ABABAABAAB
ABABABABAA
Para5
X20Y9
BBBABABABA
BABABABABA

2 个答案:

答案 0 :(得分:0)

awk 解决方案:

awk '/Para/{ p=$0 }/^X[0-9]/ && !a[$0]++{ rn=NR+2; printf "%s\n%s\n",p,$0; next }NR<=rn' file

输出:

Para1
X12Y1
AABBAABABA
BBAAABABAB
Para2
X13Y2
ABABAABAAB
ABABABABAA
Para5
X20Y9
BBBABABABA
BABABABABA

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r '/^Para/{N;H;N;N;x;s/^(.*)\n.*(\n.*)$/\2\1/;/^(\n[^\n]*)(\n.*)*(\1)/{x;d};x}' file

在匹配从Para开始的行时,将索引(第2行)附加到保留空间(HS),将以下2行附加到模式空间(PS),交换到HS并在前面添加行前面的索引(由换行符分隔),检查HS中是否已存在该索引,如果是,则交换回PS并删除该条目,否则交换回PS并打印该条目。