1

我在我的项目中被困在 1 点。我是一个生物医学科学。所以,我不太了解 perl 编程。我有一个解释蛋白质与配体相互作用的文件。该文件如下所示:

H P L A    82 SER  1290  N   -->  O12  1668 GSH   106 A  2.90
H P L A    83 SER  1301  N   -->  O12  1668 GSH   106 A  2.93
N P L A    19 LYS   302  NZ  ---  O31  1682 GSH   106 A  3.86
N P L A    22 CYS   348  CB  ---  CB2  1677 GSH   106 A  3.75
N P L A    22 CYS   348  CB  ---  SG2  1678 GSH   106 A  3.02
N P L A    22 CYS   349  SG  ---  CB2  1677 GSH   106 A  3.03
N P L A    22 CYS   349  SG  ---  SG2  1678 GSH   106 A  2.02
N P L A    24 TYR   372  CB  ---  CG1  1670 GSH   106 A  3.68

现在您可以在两行中看到O12 。同样,您可以看到也有两个CB2。这些 O12 和 CB2 是原子符号。O12 是指原子中的氧 12。现在我需要计算文件中有多少个不同的原子符号。我必须使用 perl 脚本来做到这一点。我正在使用 perl 逐行读取此文件。 while (my $line = <MYFILE>) { };现在,我需要在逐行读取文件时计算有多少不同的原子符号。我希望我足够清楚来解释我的问题。等待一个友好的答复...

4

4 回答 4

1

如何最好地解决问题取决于您的数据是如何定界的。由于它看起来像固定宽度,我将首先介绍该解决方案:

use strict;
use warnings;

my %atom;
while (<DATA>) {
    my (undef,$atom) = unpack "A34A4 ", $_;
    $atom{$atom}++;
}

print scalar keys %atom;

__DATA__
H P L A    82 SER  1290  N   -->  O12  1668 GSH   106 A  2.90
H P L A    83 SER  1301  N   -->  O12  1668 GSH   106 A  2.93
N P L A    19 LYS   302  NZ  ---  O31  1682 GSH   106 A  3.86
N P L A    22 CYS   348  CB  ---  CB2  1677 GSH   106 A  3.75
N P L A    22 CYS   348  CB  ---  SG2  1678 GSH   106 A  3.02
N P L A    22 CYS   349  SG  ---  CB2  1677 GSH   106 A  3.03
N P L A    22 CYS   349  SG  ---  SG2  1678 GSH   106 A  2.02
N P L A    24 TYR   372  CB  ---  CG1  1670 GSH   106 A  3.68

请注意,我估计了 使用的偏移量unpack,因此您可能需要调整它以适合您的数据。

如果您的数据是制表符分隔的,则需要在制表符上拆分,或者更好地Text::CSV用于解析数据。基本脚本是一样的:

use Text::CSV;

my $csv = Text::CSV->new({
        binary => 1,
        sep_char => "\t",
    });
my %atom;
while (<DATA>) {
    $csv->parse($_);
    my $atom = ($csv->fields())[9];
    next unless defined $atom;
    $atom{$atom}++;
}

您还可以使用循环条件while (my $aref = $csv->getline(*DATA)),这更有效,但如果您的 csv 数据不一致,也会中断。

一个更简单且可能有效(取决于您的数据有多复杂)的解决方案正在使用split

while (<DATA>) {
    my $atom = (split /\t/)[9];  # implicitly splits $_
    $atom{$atom}++;
}

如果您的数据是空格分隔的,只需/\t/从上面删除。

请注意,我假设所有空格都是您输入中的制表符,所以如果不是,我的计数可能需要调整。

于 2012-05-14T12:29:38.553 回答
0

在命令行中(无 perl):

cat yourfile | awk '{print $10}' | sort | uniq | wc -l

适用于您的输入。

于 2012-05-14T12:07:22.230 回答
0

看看这个 Perl Cookbook食谱

当您逐行读取文件时,您想要拆分/提取原子符号并将它们计算在哈希中。

use strict;
use warnings;
# open FILE goes here...
my %seen; # we use this to count
while (<FILE>) {
  m/--[>-]\s+(\w+)\s/; # fetch the atom symbol after arrow-thing
  $seen{$1}++;
}
close FILE;
print scalar keys %seen; # number of unique atom symbols
print join ', ', keys %seen; # List as string
于 2012-05-14T12:15:14.533 回答
-1

或者在 perl 中:

#!/usr/bin/perl

while(my $line = <DATA>){
  my $atom = (split / +/, $line)[9];

  $atoms{$atom}++;
}

print "$_: $atoms{$_}\n" for keys %atoms;

__DATA__
H P L A    82 SER  1290  N   -->  O12  1668 GSH   106 A  2.90
H P L A    83 SER  1301  N   -->  O12  1668 GSH   106 A  2.93
N P L A    19 LYS   302  NZ  ---  O31  1682 GSH   106 A  3.86
N P L A    22 CYS   348  CB  ---  CB2  1677 GSH   106 A  3.75
N P L A    22 CYS   348  CB  ---  SG2  1678 GSH   106 A  3.02
N P L A    22 CYS   349  SG  ---  CB2  1677 GSH   106 A  3.03
N P L A    22 CYS   349  SG  ---  SG2  1678 GSH   106 A  2.02
N P L A    24 TYR   372  CB  ---  CG1  1670 GSH   106 A  3.68
于 2012-05-14T12:14:52.690 回答