计算每行中字段的累积总和

时间:2018-06-28 11:08:33

标签: unix awk

免责声明:我是新手。

我一直在寻找无法成功解决我问题的答案。如果有未找到与此相关的帖子,请引导我去看看!

我一直在尝试使用awk为相当大的数据文件的每一行中的每个字段计算累积总和。任何帮助将非常感激。

我的文件包含数十万行,其中各行的长度(字段数)不同,并且最多可包含100个字段(即最多100列)。输入看起来像这样(但是实际数字要大得多),并且用制表符分隔:

12 9 2 1 7 1 4 5 1 7
19 1 1 1 1 1 1 2 5 1
45 1 5 1 8 1 2 1 4 1

我希望输出格式为“新字段2 =字段1 +字段2”和“新字段3 =字段1 +字段2 +字段3”等,即输出应如下所示(打印在一个新文件):

12 21 23 24 31 32 36 41 42 49
19 20 21 22 23 24 25 27 32 33
45 46 51 52 60 61 63 64 68 69

我一直在尝试使用awk,但是我一生都无法使用它在每个领域都可以使用(我不想键入一个命令一百次)。

很显然,我是这一切的新手,任何可行的解决方案都会令我感到高兴。不一定要awk。预先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

遵循awk可能会对您有所帮助。

awk '{for(i=2;i<=NF;i++){$i=$i+$(i-1)}} 1'  Input_file

说明:

awk '{
for(i=2;i<=NF;i++){ ##Starting a for loop from value of 2 to till value of NF.
  $i=$i+$(i-1)}}    ##Adding value of current field with previous field here and assigning to itself.
1                   ##Mentioning 1 to print the current line with edited field values.
'  Input_file       ##Mentioning Input_file name here.

答案 1 :(得分:1)

可能的Perl解决方案:

perl -lane '$c = 0; print join "\t", map $c += $_, @F'
  • -n:遍历所有输入线
  • -a:将每一行拆分为多个字段并将其放置在@F
  • -l:在每个print之后自动添加换行符
  • -e ...:程序。每行:
    • $c重置为0
    • @F的字段开始
    • 使用map将它们加到$c中,返回中间结果列表
    • 在每对中间和之间插入一个标签
    • print新行