我想删除以 开头的重复行>
以及之后的下一行。
例如:
>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