Вы упомянули Python, Perl и Awk.
Во всех трех случаях идея будет такой же: использование хэша для хранения значений.
Хеши похожи на массивы, за исключением того, что каждая запись индексируется ключом , а не местом. В хэше может быть только одна запись с этим ключом. Из-за этого хеши используются для проверки того, появились ли значения раньше. Вот краткий пример 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
Во-первых, вам нужно два контура: один Переберите все файлы, а другой цикл по каждой строке конкретный файл.
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
разделяет два значения, и я только смотрю на аминокислоту. Если положение также важно, вы должны включить это в ключ из хэш-кода %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
для форматирования моей числовой части с нулевым заполнением десятичной точки, а аминокислота - в верхнем регистре. Таким образом:
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
форматировать итоги, так что они будут выстроены.
'в то время как true': вам нужно' break' заявление или вы получите бесконечный цикл. –