繁体   English   中英

在Unix中使用awk删除重复项

[英]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=">"更改记录以包括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

似乎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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM