如何在Shell中计算累积值?

时间:2015-08-04 07:52:27

标签: linux shell unix awk

我想从下面的数据文件中计算累积值,并在插入序列号后将它们写入列中。

ifile.txt
1 2 3 2 3 1 4 5 1 
3 4 5 2 3 4 1 3 1 
1 3 2 3 2 4 1 2 4 ...............

ifile.txt在此示例中有3行9列。 欲望输出:

ofile.txt
1  1   3   1
2  3   7   4
3  6   12  6
4  8   14  9
5  11  17  11
6  12  21  15
7  16  22  16
8  21  25  18
9  22  26  22
.  
.  
.  

此处第一列用于序列号。 所以我做的是:我首先使用

转换为列
awk '{ 
for (i=1; i<=NF; i++)  {
    a[NR,i] = $i
     }
}
NF>p { p = NF }
END {    
for(j=1; j<=p; j++) {
    str=a[1,j]
    for(i=2; i<=NR; i++){
        str=str" "a[i,j];
    }
    print str
    }
 }' ifile.txt > ifile1.txt

然后我用awk

awk '{print m1=$1+m1, m2=$2+m2, m3=$3+m3}' ifile1.txt > ofile.txt

我无法继续下一步,即插入一列序列号。我也无法为任意列和行创建它。

3 个答案:

答案 0 :(得分:3)

用于序列号列

awk '{print i=i+1,m1=$1+m1, m2=$2+m2, m3=$3+m3}' ifile1.txt > ofile.txt

并完整解析您的逻辑

awk '{for(i=1;i<=NF;i++){if(i>1)$i=$i+$(i-1);f[i]=f[i]" "$i}if(NF>n)n=NF}END{for(i=1;i<=n;i++)print i,f[i]}'

答案 1 :(得分:2)

Perl救援!

perl -lane '
           $l = 0;
           push @s, [ map { $l = $l + $F[$_] } 0 .. $#F];
           }{
           for $i (0 .. $#{$s[0]}) {
               print join " ", $i + 1, map $s[$_][$i], 0 .. $#s;
           }' < ifile.txt > ofile.txt
  • -lprint
  • 添加换行符
  • -a将每一行拆分为@F数组
  • -n逐行读取输入行
  • $l是每行的“最后一笔”
  • @s是保存总和的数组数组

答案 2 :(得分:1)

在标题中生成序列号的更好方法:

首先,忘记序列号,只关注结果的生成。假设您设法在tmp_ofile.txt中获得时间结果,没有序列号。

然后,就这样做

cat -n tmp_ofile.txt > ofile.txt

您将获得序列号标题。