在unix中使用awk删除重复项

时间:2014-01-22 06:14:25

标签: unix ubuntu awk

我的档案格式为

>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

4 个答案:

答案 0 :(得分:1)

这应该做:

awk '{a[$0]++} END {for (i in a) print RS i}' RS=">" file | awk '!/^>?$/'
>id1
sequence1
>id2
sequence2

使用RS=">"更改记录,以包含idsequence.

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