【问题标题】:Finding partial duplicates in perl在 perl 中查找部分重复项
【发布时间】:2013-08-01 16:43:38
【问题描述】:

因此,经过数月的尝试和失败以及普遍陷入困境后,我最终决定走出去寻求外部帮助。我还在学习 perl 的新技巧,希望这里的人可以帮助我,所以事不宜迟......

我有以下格式的物种:

>gi|###|...|...|...[species name] amino acid sequence

在这些行中,我将有一些包含相同的物种名称(如智人),但氨基酸序列不同。这就是为什么我不能通过散列或其他方式删除重复项,因为从技术上讲,它们不是完全重复的。

我需要一种方法来删除或不打印重复的物种名称,但让我的输出文件包含上面指定的格式。因此,如果我有 3 次出现具有不同氨基序列或 # 的智人,我需要我的输出只包含一个智人(不管哪个,可以是随机的)及其对应的序列。

任何帮助或指出正确的方向将不胜感激!希望我对这个问题足够清楚。感谢您的阅读! :D

【问题讨论】:

  • 嗯,使用带有物种名称的哈希作为键?你能解释一下这对你不起作用吗?
  • 为什么不将species 存储为您的键并用您的序列值填充一个数组,然后按您的预期输出? my %h; while (<>) { push @{$h{$1}}, $2 if /\[(.+)\]\((.+)\)/; }
  • 据我了解,哈希值更具体,因此无法区分部分差异......另外,由于我需要完整的物种名称及其相应的序列,它不会检测到重复,因为即使物种名称相同,序列也不同。

标签: perl duplicates partial


【解决方案1】:

当然可以使用哈希。只需要使用正确的键即可。

my %seen;
while (<>) {
    chomp;
    my @fields = split /\|/;
    my ($species) = $fields[4] =~ /\[([^\]]+)\]/ or die;
    print "$_\n" if !$seen{$species}++;
}

示例输入:

>gi|###|[1](A)
>gi|###|[2](B)
>gi|###|[1](C)
>gi|###|[1](D)
>gi|###|[2](E)
>gi|###|[3](F)
>gi|###|[3](F)

输出:

>gi|###|[1](A)
>gi|###|[2](B)
>gi|###|[3](F)

【讨论】:

  • 所以 $species 只是我的物种名称,可以在我的数据文件中找到的散列中看到?这也会给我物种名称+相应的序列吗?感谢您的意见,还没有得到它的工作,但会继续修补。
  • 试图弄清楚为什么它没有给我输出......我正在使用 perl 5.10.0
  • 你在说什么?如果你给它任何输入,它就不可能不输出。
  • 这是奇怪的部分,在 部分中一直死掉这是输入的一个例子:>gi|45439306|ref|NP_001340.2|天冬氨酸--tRNA 连接酶,细胞质 [智人] MPSASASRKSQEKPREIMDAAEDYAKERYGISSMIQSQEKPDRVLVRVRDLTIQKADEVVWVRARVHTSR
  • 这不是您指定的格式,我错过了+。调整和固定。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2020-05-17
相关资源
最近更新 更多