Awk 如何对bash中另一列的前n行求和

Awk 如何对bash中另一列的前n行求和,awk,Awk,举个例子 1 4 2 5 3 6 1 4 2 5 3 6 我想将第二列中的数字相加,并用它创建一个新列。新列为4、9(4+5)和15(4+5+6) 1 4 4 2 5 9 3 6 15 如果您同意awk,请尝试以下内容 awk 'FNR==1{print $0,$2;prev=$2;next} {print $0,$2+prev;prev+=$2}' Input_file 或 解释:现在为上述代码添加解释 awk ' ##Startig awk prog

举个例子

1 4 2 5 3 6 1 4 2 5 3 6 我想将第二列中的数字相加,并用它创建一个新列。新列为4、9(4+5)和15(4+5+6)

1 4 4 2 5 9 3 6 15
如果您同意
awk
,请尝试以下内容

awk 'FNR==1{print $0,$2;prev=$2;next} {print $0,$2+prev;prev+=$2}'  Input_file

解释:现在为上述代码添加解释

awk '                    ##Startig awk program here.
FNR==1{                  ##Checking condition if line is first line then do following.
  print $0,$2            ##Printing current line with 2nd field here.
  prev=$2                ##Creating variable prev whose value is 2nd field of current line.
  next                   ##next will skip all further statements from here.
}                        ##Closing block for FNR condition here.
{                        ##Starting new block here.
  prev+=$2               ##Adding $2 value to prev variable value here.
  print $0,prev          ##Printing current line and prev variable here.
}' Input_file            ##mentioning Input_file name here.

PS:欢迎来到SO,您需要提及您为解决问题所付出的努力,因为我们都在这里学习。

这更为惯用

$ awk '{print $0, s+=$2}' file

1 4 4
2 5 9
3 6 15
打印当前行和值s,该值随第二个字段递增,换句话说,是一个滚动和

如果所有值都为正值(因此不可能求和为0),则可以将其转化为以下内容,但可能过于神秘

$ awk '$3=s+=$2' file
又一个awk

$ cat john_ward.txt
1 4
2 5
3 6
$ awk ' {$(NF+1)=s+=$NF}1 ' john_ward.txt
1 4 4
2 5 9
3 6 15
$

你试过什么?它可以在bash中完成,但其他语言可能更适合解决这样的问题。对于这个shell脚本有什么特殊的依赖关系吗?欢迎来到这里,您需要提到您为解决您的问题所付出的努力,因为我们都在这里学习。请在您的帖子中添加代码标签。我尝试使用awk提取第二列并循环每个数字,同时将总和存储在变量中。然后sed将结果放入旧文件中。这是非常缓慢的,因为我正在处理一个大文件,我想知道是否有一个命令更快的方法。我是bash新手,所以我对命令不太熟悉yet@JohnWard,然后请通过编辑在您的帖子中添加清晰的需求图片,并让我们知道。顺便说一句,你试过我的命令了吗?按照建议总是发布你试过的内容,以及任何错误(例如)--你的问题会被更好地接受(并且你会收到更少的反对票
:)
提供这两种形式是一种非常有指导性的方法。首先,在一般表达式中使用直接的逻辑流,但要长一些击键,还有一个稍微精简的版本。这正是我想要的。非常感谢。你介意解释一下这是怎么回事吗?@JohnWard补充了详细的方式解释,请检查一下,如果有任何疑问,请告诉我。
$ awk '$3=s+=$2' file
$ cat john_ward.txt
1 4
2 5
3 6
$ awk ' {$(NF+1)=s+=$NF}1 ' john_ward.txt
1 4 4
2 5 9
3 6 15
$