带有移动列的累计总数

Tom*_*Tom 3 awk

提前道歉,因为我确信这是一个简单的问题。尽管如此,这里是。

cat blah.txt
aa+2
bb+4
cc+10
dd+31
Run Code Online (Sandbox Code Playgroud)

我想处理 blah.txt 以生成以下内容:

aa+0
bb+2
cc+6
dd+16
Run Code Online (Sandbox Code Playgroud)

这里的概念是第一列可能是歌曲列表,第二列可能是它们的开始时间。

我的预感是使用 awk 来做到这一点。我想到了两个带有数字索引的数组,其中存储了 $1 和 $2 的运行总数。我的想法是将运行总计的数字索引移动 1。

tail -r blah.txt | 
awk -F "+" '{ for(i=0;i<=NR;i++) arr[i+1]+=$2; farr[i]=$1 } END 
{ for(i=NR+1;i>1;i--) {if (i==NR) {print farr[NR] FS 0 } 
else { print farr[i] FS arr[i]}}}'
Run Code Online (Sandbox Code Playgroud)

这并不简洁,更何况是行不通的。我首先对阵列制作的失败感到困惑。

不管怎样,'nuf 说,请好心人帮我摆脱痛苦吗?

汤姆

jll*_*gre 6

干得好:

$ awk -F+ '{sum+=$2;printf("%s+%d\n",$1,sum-$2);}' blah.txt
aa+0
bb+2
cc+6
dd+16
Run Code Online (Sandbox Code Playgroud)

编辑 1:感谢 Sukminder,这是一种稍微简单的方法

$ awk -F+ '{printf("%s+%d\n",$1,sum);sum+=$2}' blah.txt
Run Code Online (Sandbox Code Playgroud)

Edit2: 稍微简洁一点,感谢 Bernhard:

$ awk -F+ '{print $1,sum;sum+=$2}' OFS="+" blah.txt
Run Code Online (Sandbox Code Playgroud)

Edit3: 但前者没有在第一行显示 0,所以这里有一个更正且有点打包的版本,它显示了回答 Tom 问题的较短方法(直到一些新评论提出更好的方法):

$ awk -F+ '{print$1,s+0;s+=$2}' OFS=+ blah.txt
Run Code Online (Sandbox Code Playgroud)