[英]removing duplicates using awk in unix
我的文件格式为
>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
应该这样做:
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
似乎ID行以>
开头。 给定输出顺序,您想要第一个与给定ID相关联的序列,而不是最后一个。 这意味着您需要以下内容:
awk '/^>/ { if (id[$1]++ == 0) printing = 1; else printing = 0 }
{ if (printing) print }'
第一行确定当前ID是否唯一,如果是,则将printing
设置为1,否则设置为0。 第二行记录是否需要打印,并正确打印。 请注意,如果序列中有多行数据,则很高兴打印所有这些行。 它不依赖于序列数据中只有一行。
假设您的ID和序列始终仅是一行:
awk 'NR%2 && !a[$0]++ { print; getline l ; print l }' input
我更喜欢awk
,您不需要管道,它按照它们在原始文件中出现的顺序打印行。
如果您不介意行顺序,则可以使用sort
xargs -n2 < file | sort -uk1,1 | xargs -n1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.