2012-03-15 1 views
0

Это последующая деятельность после How do I average column values from a tab-separated data file, ignoring a header row and the left column?. Задача: открыть и прочитать файл; дойти до каждой строки, разделить содержимое на массив и вычислить среднее числовые значения; и, наконец, записать в новый файл средние значения для каждого из столбцов, содержащих числовые значения.Почему я не вижу вычисленных результатов в моем выходном файле?

Все, кажется, хорошо до последней точки. Проблема в том, что я могу создать новый файл .txt, сам файл .txt не имеет того, что напечатано на выходе. Предпочтительно, как новый пользователь Perl, я бы предпочел сохранить сценарий в стиле, написанном ниже, чтобы я мог лучше понять его. Я не так хорош с более сжатыми версиями, которые потенциально могут быть там. Благодаря jchips12 за то, что он значительно полезен.

Во всяком случае, код:

#!/usr/bin/perl -w 
use strict; 
my $infile = "Lab1_table.txt"; # This is the file path 
open INFILE, $infile or die "Can't open $infile: $!"; 
my $outfile = "Lab1_tableoutput.txt"; 
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; 

my $count = 0; 
my @header =(); 
my @average =(); 

while (<INFILE>) { 
    chomp; 
    my @columns = split /\t/; 
    $count++; 
    if ($count == 1) { 
     @header = @columns; 
    } else { 
     for(my $i = 1; $i < scalar @columns; $i++) { 
      $average[$i] += $columns[$i]; 
     } 
    } 
} 

for(my $i = 1; $i < scalar @average; $i++) { 
    print $average[$i]/($count-1), "\n"; 
} 

print OUTFILE "\n"; 
close OUTFILE; 

данные пришли из файла Lab1_table.txt следующим образом:

retrovirus  genome gag  pol  env 
HIV-1   9181 1503 3006 2571 
FIV    9474 1353 2993 2571 
KoRV   8431 1566 3384 1980 
GaLV   8088 1563 3498 2058 
PERV   8072 1560 3621 1532 

В результате производит правильные средние значения, хотя и немного грязный в терминале и они не помечены как соответствующие любому номеру столбца/имени. Также создается файл .txt, но без вывода.

Результаты вышли как:

Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X 
0 
8649.2 
1509 
3300.4 
2142.4 

***Line X: Where X is either 2, 3, 4, 5, or 6.*** 

Из этого я могу сделать вывод, что ошибки «Аргумент» имеют в виду заголовков столбцов 5, и 0 к единственной колонке с нечисловых значений.

Помогите с получением файла для записи в файл .txt или каким-либо способом, который я могу прочитать, как показано в командной строке, будет очень признателен. Кроме того, хотя я смутно знаю, что происходит на каждом этапе кода, я был бы признателен за более глубокое понимание того, что происходит на большинстве шагов, если это возможно. Я все еще его читаю, но более тонкие детали я хочу четко понять.

+0

См. Мой комментарий ниже. Я думаю, вы можете исправить это, используя шаблон: \ t + вместо \ t –

+0

@PkC: Кажется, модератор сайта отменил наше последнее обсуждение. Если вы найдете этот комментарий, заполненный скрипт находится в [http://derivations.org/acgt.txt]. Мой e-mail (который я скоро удалю отсюда) - tbtkorg в gmail dot com. – thb

ответ

0

Задание комментарии для каждой строки, чтобы дать вам четкое понимание

#!/usr/bin/perl -w 
use strict; 
use warnings; 

my $infile = "Lab1_table.txt";       # input file path 
open INFILE, $infile or die "Can't open $infile: $!"; # input file opened 
my $outfile = "Lab1_tableoutput.txt";     # output file path 
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # output file opened 

my $count = 0;    # count variable to check for header row in file 
my @header =();   # variable to store headers/column names of file 
my @average =();   # variable to store average calculated for each column 

while (<INFILE>) {  
chomp; 
my @columns = split /\s+/; # \s stands for [\ \t\r\n\f] 
$count++;  

if ($count == 1) {   
        @header = @columns;  # executed only once for header 
     } 
else {          # else column executed for remaining rows 
     for(my $i = 1; $i < scalar @columns; $i++) { # $i=1 means skip first column 
       $average[$i] += $columns[$i];  # calcuate average for each row 
      } 
     } 
} 
for(my $i = 1; $i < scalar @average; $i++) {  

    print OUTFILE $average[$i]/($count-1), "\n"; # This will write to output file 

    }  
close OUTFILE; 

Использование print OUTFILE $average[$i]/($count-1), "\n"; для записи в файл.

Ошибка Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X может быть, если значения в столбцах, которые вы добавляете, случайно имеют в себе строку, а не цифру. Проверьте свой входной файл.

Примечание: Я не становлюсь выше error.Script работает гладко с данными выше. Однако, если я изменю одно из числа на строку, я получаю эту ошибку.

+0

Может быть 2 вкладки, разделяющие столбцы ретровируса и генома (первый и второй). Это создало бы другой столбец для суммы, значения которого представляют собой пустую строку. "". Это может быть проблема, которую он видит. –

+0

Его код разбивается на одну вкладку, где ваш код разбивается на \ s + –

+0

@ ChrisCharley. В данных нет данных, т. Е. Имена номеров/заголовков. Мы можем использовать '\ s +' для tab.If вы хотите, чтобы вы также могли использовать '\ T'. –

 Смежные вопросы

  • Нет связанных вопросов^_^