我的档案格式为
>id1
sequence1
>id2
sequence2
>id1
sequence3
我想要的输出是:
>id1
sequence1
>id2
sequence2
即。如果id重复,我需要成对删除序列和id。
我尝试了以下代码,但它不起作用。
awk '{
if(NR%2 == 1)
{
fastaheader = $0; x[fasta_header] = x[fasta_header] + 1;
}
else
{
seq = $0; {if(x[fasta_header] <= 1) {print fasta_header;print seq;}}
}
}' filename.txt
答案 0 :(得分:1)
这应该做:
awk '{a[$0]++} END {for (i in a) print RS i}' RS=">" file | awk '!/^>?$/'
>id1
sequence1
>id2
sequence2
使用RS=">"
更改记录,以包含id
和sequence.
awk '{$1=$1}1' RS=">"
id1 sequence1
id2 sequence2
id1 sequence1
然后数组删除所有重复的
最后一个awk '!/^>?$/'
只删除了一些空格和一个额外的>
cat file2
>id1
sequence1
>id2
sequence2
>id1
sequence3
这个文件应该是完整的,因为顺序的数字都是不同的。
awk '{a[$0]++} END {for (i in a) print RS i}' RS=">" file2 | awk '!/^>?$/'
>id1
sequence1
>id2
sequence2
>id1
sequence3
答案 1 :(得分:1)
看起来ID行以>
开头。给定输出的顺序,您需要与给定ID关联的第一个序列,而不是最后一个。这意味着您需要以下内容:
awk '/^>/ { if (id[$1]++ == 0) printing = 1; else printing = 0 }
{ if (printing) print }'
第一行决定当前ID是否唯一,如果是,则将printing
设置为1,否则设置为0。第二行说明是否需要打印,并进行适当打印。请注意,如果序列中有多行数据,则很高兴打印所有这些行。它不依赖于序列数据中只有一行。
答案 2 :(得分:1)
假设你的id和序列总是恰好一行:
awk 'NR%2 && !a[$0]++ { print; getline l ; print l }' input
答案 3 :(得分:0)
我更喜欢awk
,你不需要管道,它按照它们在原始文件中出现的顺序打印行。
如果您不介意线序,可以使用sort
xargs -n2 < file | sort -uk1,1 | xargs -n1