然后添加来自不同列的值并按顺序排序

时间:2013-08-01 09:35:22

标签: awk

我正在努力实现以下目标,但我在编程主题方面是全新的,我变得疯狂。我已经看到很多例子,它解释了如何使列的总和,但从来没有如何从同一行添加值。我试图用awk命令做一些事情,但它完全没用......

我有这个输入:

10000   4.32078125e-05 2.319742728e-05 -1.626118465e-06 2.116442767e-05 2.824876608e-06 -2.008498137e-07 1.378852315e-11 -2.461344776e-11 -1.185369303e-11 -4.711965783e-11 -7.488327241e-10 -1.133857758e-08

为了不让这么多数字变得疯狂,它就像是:

#Iteration #FpX #FpY #FpZ #FvX #FvY #FvZ #MpX #MpY #MpZ #MvX #MvY #MvZ

我需要以下输出(第一行是文本):

Iteration      FX        FY         FZ         MX       MY        MZ
#Iteration #FpX+#FvX #FpY+#FvY  #FpZ+#FvZ  #MpX+#MvX #MpY+#MvY #MpZ+#MvZ

2 个答案:

答案 0 :(得分:2)

您可以通过<N>引用$<N>列(字段),例如$1你可以用来做你的算术:

$ cat foo.input
10000   4.32078125e-05 2.319742728e-05 -1.626118465e-06 2.116442767e-05 2.824876608e-06 -2.008498137e-07 1.378852315e-11 -2.461344776e-11 -1.185369303e-11 -4.711965783e-11 -7.488327241e-10 -1.133857758e-08
10001   1              2               3                4               5               6                7               8                9                10               11               12

$ awk \
    'BEGIN { printf "%-11s %-12s %-12s %-12s %-12s %-12s %-12s\n", "Iteration", "FX", "FY", "FZ", "MX", "MY", "MZ"  }
     NF    { printf "%-11s %-12s %-12s %-12s %-12s %-12s %-12s\n", $1, $2+$5, $3+$6, $4+$7, $8+$11, $9+$12, $10+$13 }' foo.input
Iteration   FX           FY           FZ           MX           MY           MZ
10000       6.43722e-05  2.60223e-05  -1.82697e-06 -3.33311e-11 -7.73446e-10 -1.13504e-08
10001       5            7            9            17           19           21

答案 1 :(得分:0)

如果您不需要标题,则可以使用:

perl -lane 'push @a,$F[0];
            for($i=1;$i<13;$i++){
            $i+=3 if($i==4);
            push @a,$F[$i]+$F[$i+3]}
            print "@a"' your_file

测试如下:

> perl -lane 'push @a,$F[0];for($i=1;$i<13;$i++){$i+=3 if($i==4);push @a,$F[$i]+$F[$i+3]}print "@a"' temp
10000 6.437224017e-05 2.6022303888e-05 -1.8269682787e-06 -3.333113468e-11 -7.7344617186e-10 -1.135043127303e-08 -4.711965783e-11 -7.488327241e-10 -1.133857758e-08