Python、Perl、および Awk について言及しました。
3 つすべてで、アイデアは同じです。ハッシュを使用して値を格納します。
ハッシュは配列に似ていますが、各エントリは場所ではなくキーでインデックス付けされます。ハッシュでは、そのキーを持つエントリは 1 つしか存在できません。このため、値が以前に出現したかどうかを確認するためにハッシュが使用されます。Perl の簡単な例を次に示します。
my %value_hash;
for my $value ( qw(one two three one three four) ) {
if ( exists $value_hash{$value} ) {
print "I've seen the value $value before\n";
}
else {
print "The value of $value is new\n";
$value_hash{$value} = 1;
}
}
これは出力されます:
The value of one is new
The value of two is new
The value of three is new
I've seen the value of one before
I've seen the value of three before
The value of four is new
まず、2 つのループが必要です。1 つはすべてのファイルをループするループで、もう 1 つは特定のファイルの各行をループするループです。
for my $file_name ( @file_list ) {
open my $file_fh, "<", $file_name
or die qw(File $file_name doesn't exist);
while (my $line = <$file_fh>) {
chomp $line;
...
}
}
次に、各アミノ酸の合計のハッシュと、それらのアミノ酸の追跡ハッシュを導入します。
use strict;
use warnings;
use autodie;
my %total_amino_acids;
my @file_list = qw(file1 file2); #Your list of files
for my $file_name ( @file_list ) {
open my $file_fh, "<", $file_name;
my %seen_amino_acid_before; # "Initialize" hash which tracks seen
while (my $line = <$file_fh>) {
chomp $line;
my ( $location, $amino_acid ) = split $line;
if ( not %seen_amino_acid_before{$amino_acid} ) {
$total_amino_acids{$amino_acid} += 1;
}
}
}
さて、あなたがユニークと言ったとき、あなたは位置ではなくアミノ酸だけについて話していたと思います. はsplit
2 つの値を分割しており、アミノ酸だけを見ています。位置も重要な場合は、それを%seen_amino_acid_before
ハッシュのキーに含める必要があります。次のことを想像できるので、これは注意が必要です。
54 LEU
54 LEU
054.00 LEU
これらは異なる文字列ですが、すべて同じ情報を持っています。位置/アミノ酸キーを標準化することを確認する必要があります.
while (my $line = <$file_fh>) {
chomp $line;
my ( $location, $amino_acid ) = split $line;
my $amino_acid_key = sprinf "%04d-%s", $location, uc $amino_acid;
if ( not %seen_amino_acid_before{$amino_acid_key} ) {
$total_amino_acids{$amino_acid} += 1;
}
}
上記では、$amino_acid_key
. sprintf
私は、数値部分をゼロで埋められた 10 進数に、アミノ酸を大文字にフォーマットするために使用します。こちらです:
54 LEU
54 leu
054.00 Leu
すべてが鍵になります0054-LEU
。そうすれば、ファイルにデータを入力する方法が結果に影響を与えることはありません。これは完全に不必要な手順かもしれませんが、常に考慮する必要があります。たとえば、データがコンピューターで生成されたものである場合、これはおそらく問題になりません。あなたのデータが深夜に過労の大学院生によって入力された場合、おそらく形式について心配する必要があります。
必要なのは、データを読み取るためのループだけです。
for my $amino_acid ( sort keys %total_amino_acids ) {
printf "total no:of %4s - %4d\n", $amino_acid, $total_amino_acids{$amino_acid};
}
printf
以前は合計の書式を設定していたことに注意してください。