移動列の累積合計

移動列の累積合計

これは簡単な質問なので事前にお詫び申し上げます。それでもそうです。

cat blah.txt
aa+2
bb+4
cc+10
dd+31

blah.txtを処理して以下を生成したいと思います。

aa+0
bb+2
cc+6
dd+16

ここでの概念は、最初の列が曲のリストになり、2番目の列が曲の開始時刻になる可能性があることです。

私の本能は、これを達成するためにawkを使用することです。私は$ 1と$ 2の累計を格納する数値インデックスを持つ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]}}}'

きれいでも動作しません。まず、アレイの製造に失敗して混乱しています。

とにかく、どんなフレンドリーな魂が私を不幸から救うことができますか?

トム

ベストアンサー1

ここにあります:

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

Edit1:Sukminderのおかげで、少し簡単なアプローチがあります。

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

Edit2:Bernhardのおかげでもう少し簡潔になりました。

$ awk -F+ '{print $1,sum;sum+=$2}' OFS="+" blah.txt

編集3:しかし、前者は最初の行にゼロを表示しないので、ここにTomの質問に答えるより短い方法を示す修正され、やや圧縮されたバージョンがあります(いくつかの新しいコメントがより良い方法を提案するまで) 。

$ awk -F+ '{print$1,s+0;s+=$2}' OFS=+ blah.txt

おすすめ記事