提前道歉,因为我确信这是一个简单的问题。尽管如此,这里是。
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 说,请好心人帮我摆脱痛苦吗?
汤姆
干得好:
$ 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)