以下 awk 行将删除重复信息。我可以通过 3 种方式查看如何检测重复项:
序列名称相同:
简短的版本是:
$ awk '/^>/{p=seen[$0]++}!p' file1.fasta file2.fasta file3.fasta ...
然而,以下版本引入了更多的清晰度,并允许任何用户快速适应他的需求:
$ awk 'BEGIN{RS=">"; FS="\n"; ORS=""}
(FNR==1){next}
{ name=$1; seq=$0; gsub(/(^[^\n]*|)\n/,"",seq) }
!(seen[name]++){ print ">" $0 }' file1.fasta file2.fasta file3.fasta ...
这里我们引入了变量name
它保存序列名称和变量seq
保存序列本身。多行序列被移动到变量中的单行。
如前所述,当使用其他指标来确定重复时,这很容易适应。例如。
序列名称的第一部分相同:
$ awk 'BEGIN{RS=">"; FS="\n"; ORS=""}
(FNR==1){next}
{ name=$1; seq=$0; gsub(/(^[^\n]*|)\n/,"",seq) }
{ key=substr(name,1,index(s,"|")) }
!(seen[key]++){ print ">" $0 }' file1.fasta file2.fasta file3.fasta ...
序列相同:
$ awk 'BEGIN{RS=">"; FS="\n"; ORS=""}
(FNR==1){next}
{ name=$1; seq=$0; gsub(/(^[^\n]*|)\n/,"",seq) }
!(seen[seq]++){ print ">" $0 }' file1.fasta file2.fasta file3.fasta ...
序列名称和序列相同:
$ awk 'BEGIN{RS=">"; FS="\n"; ORS=""}
(FNR==1){next}
{ name=$1; seq=$0; gsub(/(^[^\n]*|)\n/,"",seq) }
!(seen[name,seq]++){ print ">" $0 }' file1.fasta file2.fasta file3.fasta ...
在某些部分你当然可以清理。您并不总是需要name
确定重复项(参见序列相同)或者你并不总是需要seq
(see 序列名称相同)。这允许您删除代码的某些部分。我只是保持这种方式,没有清理,以展示您可以使用的方法。
note:上面利用了如果字段重复则删除行 https://stackoverflow.com/questions/2604088/remove-line-if-field-is-duplicate