【问题标题】:Use sed to remove a block of duplicated text使用 sed 删除重复的文本块
【发布时间】:2017-08-23 06:23:10
【问题描述】:

数据是这样的

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

【问题讨论】:

  • 每条记录是否包含 4 行?

标签: sed uniq


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这可能对你有用(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 并打印该条目。

    【讨论】: