![处理多行滑动窗口](https://linux22.com/image/129037/%E5%A4%84%E7%90%86%E5%A4%9A%E8%A1%8C%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3.png)
标题概括了我想要的内容。具体问题:给出一些输出多个时间戳的命令,例如:
$ 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
我想计算每两个差异。我最终做了类似的事情:
$ 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
所以我设法度过了难关,但一定有更简单的方法。概括为:给定多行输出,如何使用args 步长x
立即计算 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
更复杂的计算
下面的代码从当前行中的数字开始,加上前一行中数字的两倍,然后减去前五行中数字的三倍:
awk '{a[NR]=$1} NR>5{print a[NR]+2*a[NR-1]-3*a[NR-5]}' timestamps
答案2
安装数字实用程序,然后将文件或数据通过管道传输到numinterval
:
sort -n timestamps | numinterval