处理多行滑动窗口

处理多行滑动窗口

标题概括了我想要的内容。具体问题:给出一些输出多个时间戳的命令,例如:

$ 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

相关内容