如何删除以模式开头的重复行及其后的下一行?

如何删除以模式开头的重复行及其后的下一行?

我想删除以 开头的重复行>以及之后的下一行。

例如:

>1
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT
>1 
ACCGGTTTCCTTGAAATT

正如你所看到的,我有接下来的两行重复的行:

AACCTTCCGGTTAATT and >1 

但是我只想删除>1下一行,所以我想要输出如下:

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3
AACCTTCCGGTTAATT

如果我使用类似的东西:

awk '!seen[$0]++'  filename

输出是:

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3

因为它删除了所有重复的行,而我只想删除以 开头的重复行>以及之后的下一行。

我的真实文件大约有几千行,因此我可以在符号后面有几个>可以重复的名称。

有什么建议么?

答案1

您可以getline在 awk 中使用来获取下一行:

awk '/^>/{ if(!seen[$0]++){ print;getline;print } else { getline } }'

有一个更简单的答案也可以处理多行:

awk '/^>/{ skip = seen[$0]++ }
     { if(!skip)print }'

答案2

带有 POSIX 工具箱:

paste - - <file | awk '{$1=$1};!seen[$0]++' | tr '\t' '\n'

答案3

awk

awk 'NR%2==1{l=$0;next} !seen[l"\n"$0]++{print l"\n"$0}' file
  • NR%2==1每第二行为真,因此带有>1,>2和 的行>3。在本例中,将该内容保存到变量中l并继续该next行。
  • !seen[l"\n"$0]++在这里我们不检查唯一的行,我们检查2独特的连续线。
    • 如果它们是唯一的,则打印最后一行l和当前行,$0并在它们之间换行\n

输出:

>1 
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT

相关内容