2009-10-20 3 views
-1

У меня есть файл с следующими данными:Как я могу суммировать каждый столбец моих данных в Perl?

 
1==0==2 
5==3==2 
7==1==0 

, как добавить столбец числового значения мудр. Мне нужно подвести итог и распечатать его как

 
1==0==2 
5==3==2 
7==1==0 
13==4==4 * summation column wise (This is what I want to calculate using perl) 

Я думаю, вы неправильно поняли мой вопрос. Я еще раз отредактировал мой вопрос ... я имел в виду, что у меня много таких столбцов в таблице 13 == 4 == 4 - это столбец суммирования, который я хочу добавить в свой файл.

Я смог сделать это только для первого столбца, но мне нужно узнать, как это сделать для всех остальных столбцов.

мой код:

#!/usr/bin/perl 

use strict; 
use warnings; 

open (TEMPTABLE,"temp_data") or die "Cannot open file\n"; 

my @temp_table_data=<TEMPTABLE> ; 
chomp @temp_table_data; 

my $total_sum; 
for(my $i=0;$i<=$#temp_table_data;$i++) 
{ 
print "$temp_table_data[$i]\n"; 
my @col=split('==',$temp_table_data[$i]); 
for(my $m=0;$m<1;$m++) 
{ 
$total_sum+=$col[$m]; 
}  
} 
print "$total_sum\n"; 

OUTPUT: 
1==0==2 
5==3==2 
7==1==0 
13 

Я не хочу подводить ROW, но COLUMN.

+1

Вы говорите, что '==' - ваш разделитель столбцов? – Axeman

+0

yes == - мой разделитель столбцов. – Suren

+0

Я попытался создать массив и захватить данные, но я не могу захватить столбцы данных в массиве. – Suren

ответ

6

Люди пытаются быть довольно умна в своих ответах. Я думаю, что гораздо более ясно, что происходит без трюков. Вы, конечно, не нуждаетесь в pairwise, и я думаю, что в этом случае это делает код сложнее следовать. Это просто с помощью встроенного Perl:

my @sums; 

while(<DATA>) { 
    my @summands = split /==/; 

    foreach my $i (0 .. $#summands) { 
    $sums[$i] += $summands[$i]; 
    } 
} 

print "Sums are (@sums)\n"; 

__END__ 
1==0==2 
5==3==2 
7==1==0 
+0

@Brian, ваш скрипт работает очень хорошо, спасибо, большое спасибо за коды. – Suren

+0

Ницца - спасибо за это. –

3
  1. Создать переменную, которая может быть массив
  2. Go через каждую строку и последовательно добавить значения в массив
  3. Повторить, пока не сделано.
+0

спасибо mani, но я не смог закодировать в соответствии с вашим описанием. – Suren

4

То, что вы пытаетесь сделать, не кажется таким сложным. Если '==' ваш разделитель столбцов:

use strict; 
use warnings; 
use List::MoreUtils qw<pairwise>; 

our ($a, $b); 

my @totals; 

while (my $record = <DATA>) { 
    chomp $record; 
    my @data = split /==/, $record; 
    push @totals, (0) x (@data - @totals) if @data > @totals; 
    pairwise { $a += $b } @totals, @data; 
} 
__DATA__ 
1==0==2 
5==3==2 
7==1==0 
13==4==4 
+0

+1 для попарно. –

+0

Я хотел сделать это самомодифицирующимся недействительным вызовом в попарно: 'pairwise {$ a + = $ b} @totals, ...' но это не позволит мне. – Axeman

+0

@Axeman Hmmm ... Если вы добавите 'my @totals = (0) x 3;' он позволит вам использовать его в пустотном контексте.Я не уверен, есть ли веская причина для того, чтобы значение autovivified не поддавалось модификации или это ошибка. –

1

Вот мой вход

use strict; 
use warnings; 

my @LineTotalsArray; 

while (my $line = <DATA>) { 
    print $line; 
    chomp $line; 

    my $index=0; 
    for my $val (split /==/, $line) { 
     $LineTotalsArray[ $index++ ] += $val; 
    } 
} 

print join('==', @LineTotalsArray), "\n"; 

__DATA__ 
1==0==2 
5==3==2 
7==1==0 
+0

Thanx Lexu. Ваш скрипт работает. Еще раз спасибо. – Suren

+0

Ваш прием. Обратите внимание, что я внедрил предложение Манни .. – lexu

+0

Не могли бы вы объяснить мне, что $ LineTotalsArray -> [$ index ++] + = $ val; означает и что делает? – Suren

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