Считайте сумму каждого столбца в файле

В файле с другим числом столбцов, разграниченных пространством '', Как считать сумму столбцов. Пример показал бы потребность:

File A:

1 2 
2 3
4 5 6 
1 1 1 5

Затем вывод был бы:

  • для столбца 1 (1+2+4+1) =8
  • поскольку столбец 2 равняется 11
  • поскольку столбец 3 равняется 7
  • поскольку столбец 4 равняется 5
8
задан 18 June 2015 в 06:44

6 ответов

Используя awk

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print "for column "i" is " sum[i];}' FileA
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5
12
ответ дан 23 November 2019 в 05:23
#!/bin/sh

while read a b c d; do
    col1=$((col1 + a))
    col2=$((col2 + b))
    col3=$((col3 + c))
    col4=$((col4 + d))
done < File_A

echo $col1 $col2 $col3 $col4
3
ответ дан 23 November 2019 в 05:23

Судя комментариями к Вашему собственному ответу, Вы только хотите сумму одного столбца за один раз. Если так, вот non-awk способ сделать это:

cut -d' ' -f3 FileA | grep . | paste -s -d+ | bc

, где Вы заменили бы 3 номером столбца, Вы интересуетесь.

3
ответ дан 23 November 2019 в 05:23

Вот подход сценария Perl остроты. Это полагается на использование -a флаг, который позволяет авторазделять в настоящее время строку чтения с -n флаг в массив @F. Все, что мы должны сделать, выполняют итерации по тем объектам и добавляют их к их соответствующему индексу в $sum массив, таким образом эффективно каждый объект массива является суммой для каждого соответствующего столбца. Наконец, мы печатаем результат в END блок кода.

$ perl -lane '$j=0;foreach $i (@F){$sum[$j]+=$i; $j+=1;}; END{print join("\n",@sum)} ' input.txt                                                     
8
11
7
5

, С другой стороны, вот полный подход сценария Perl. Это полагается на разделение каждой строки в массив и итерации по каждому объекту в том массиве, добавляющем каждое число к их соответствующему положению в @sums массив. Сценарий распечатывает каждую строку, затем представляет отчет для каждого столбца. Печать каждой строки может быть удалена путем добавления # прежде printf("%s",$line);

#!/usr/bin/env perl
use strict;
use warnings;

open(my $fh,"<",$ARGV[0]); 
my $i = 0;
my @sums;

while(my $line = <$fh>) { 
    printf("%s",$line);
    my @nums = split(" ",$line);
    my $j = 0;
    foreach my $num (@nums){
        $sums[$j] += $num;
        $j += 1;
    }

}

my $k = 0;
foreach my $sum (@sums){
    printf("- column %d sum: %d\n",$k,$sum);
    $k+=1;
}

close($fh);

, использование просто chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt. Например:

$ ./sum_columns_2.pl input.txt                                                                                                                       
1 2 
2 3
4 5 6 
1 1 1 5
- column 0 sum: 8
- column 1 sum: 11
- column 2 sum: 7
- column 3 sum: 5
0
ответ дан 23 November 2019 в 05:23

Простое решение:

awk '{sum += $i} END {print sum}' file

Замена i с номером столбца, например, column1:

awk '{sum += $1} END {print sum}' file

вывод:

8
-2
ответ дан 23 November 2019 в 05:23

Использовать numsum для той задачи и отдельный между обработкой данных и выводом результаты.

Установка num-utils, нам нужно numsum

sudo apt-get install num-utils

И запустите с

numsum -c <your_file_name>

Пример

$ cat "File A"
1 2 
2 3
4 5 6 
1 1 1 5

$ numsum -c "File A"
8 11 7 5

или с Вашим нужным форматом:

$ numsum -c "File A" | awk '{for(i=1;i<=NF;i++) {print "for column "i" is "$i}}'
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5

от man numsum

-c      Print out the sum of each column.

примеры от man numsum

EXAMPLES

   Add up the 1st, 2nd and 5th columns only.

       $ numsum -c -x 1,2,5 columns
       15 40 115

   Add up the rows of numbers of a file.

        $ numsum -r columns
        55
        60
        65
        70
        75
4
ответ дан 23 November 2019 в 05:23

Другие вопросы по тегам:

Похожие вопросы: