计算文件中每列的总和

计算文件中每列的总和

在一个由空格“ ”分隔的不同列数的文件中,如何计算列的总和。以下示例显示了需要:

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

答案1

使用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

答案2

用于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

答案3

#!/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

答案4

这是一个单行 Perl 脚本方法。这依赖于标志的使用,它允许将当前读取的带有标志-a的行自动拆分到数组中。我们所要做的就是遍历这些项目,并将它们添加到数组中的相应索引中,这样实际上每个数组项目就是每个相应列的总和。最后,我们在代码块中打印结果 。-n@F$sumEND

$ 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

相关内容