複数行のスライドウィンドウの処理

複数行のスライドウィンドウの処理

タイトルは私が望むものを要約します。具体的な質問:複数のタイムスタンプを出力するいくつかのコマンドを提供してください。たとえば、次のようになります。

$ cat timestamps | sort -n
1508349271820
1508349271821
1508349425222
1508349425223
1508349454218
1508349476419
1508349500018
1508349500020
1508349698820
1508349698822
1508350047721
1508350047724
1508351635621
1508351635623
1508351699618
1508351699620
1508351699621
1508351699622
1508351699623
1508352230120
1508352230123
1508352230124
1508352230125
1508352232219
1508352232220
1508352364919
1508352364920
1508352387618
1508352387619

2つの値の違いを計算したいです。私は結局次のことをしました。

$ wc -l timestamps
29

cat <(sort -n timestamps | head -28) <(sort -n timestamps | tail -28) | sort -n | xargs -n 2 sh 'calc $2 - $1' sh
1
153401
1
28995
22201
23599
2
198800
2
348899
3
1587897
2
63995
2
1
1
1
530497
3
1
1
2094
1
132699
1
22698
1

だからこんなにやりましたが、もっと簡単な方法があると思います。要約すると、複数行の出力がある場合は、xargsステップサイズを使用してargsのスライドウィンドウをどのようにすぐに計算できますか?y

ベストアンサー1

awkはこれを行うのに適しています。

awk 'NR>1{print $1-last} {last=$1}' timestamps

上から最初の()以降NR>1の各行について、現在の値から前の$1行の値を引いた値を印刷しますlast。次に値を更新しますlast

はい

$ awk 'NR>1{print $1-last} {last=$1}' timestamps
1
153401
1
28995
22201
23599
2
198800
2
348899
3
1587897
2
63995
2
1
1
1
530497
3
1
1
2094
1
132699
1
22698
1

より複雑な計算

次のコードは現在の行の数字で始まり、前の行の数字の2倍を加算し、前の5行の数字の3倍を減算します。

awk '{a[NR]=$1} NR>5{print a[NR]+2*a[NR-1]-3*a[NR-5]}' timestamps

おすすめ記事