处理多行滑动窗口

gil*_*och 3 bash xargs

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

$ 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
Run Code Online (Sandbox Code Playgroud)

我想计算每个 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
Run Code Online (Sandbox Code Playgroud)

所以我设法通过了,但肯定有更简单的方法。概括是:给定多行的输出,我如何一次计算xargs的滑动窗口,具有yargs 步长?

Joh*_*024 7

awk 非常适合于此:

awk 'NR>1{print $1-last} {last=$1}' timestamps
Run Code Online (Sandbox Code Playgroud)

在上面,对于第一行 ( 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
Run Code Online (Sandbox Code Playgroud)

更复杂的计算

下面的代码从当前行的数字开始,加上前一行数字的两倍,然后减去前五行行数字的三倍:

awk '{a[NR]=$1} NR>5{print a[NR]+2*a[NR-1]-3*a[NR-5]}' timestamps
Run Code Online (Sandbox Code Playgroud)

  • @giladhoch 尽我所能从你的描述中看出(例如,我完全不确定“共享 1 个参数”的真正含义),awk 对所有这些事情都有好处。另外,如果您在此处提出的问题不是您想要回答的问题,您可能会提出另一个更直接针对您想要的问题的问题。 (4认同)

agc*_*agc 5

安装num-utils,然后将文件或数据通过管道传输到numinterval

sort -n timestamps | numinterval
Run Code Online (Sandbox Code Playgroud)