13

我有一个包含一列数字的文件:

1
2
4
4
10

我想使用 awk 计算每个数字之间的差异。输出应该是这样的:

1
2
0
6

我该怎么做 ?

4

4 回答 4

23

试试下面的代码:

awk '
    NR == 1{old = $1; next}     # if 1st line 
    {print $1 - old; old = $1}  # else...
' file.txt
1
2
0
6

解释

  • NR是从输入开始的当前记录的序号。在 BEGIN 动作中,该值应为零。在 END 动作中,该值应为最后处理的记录的编号。
  • next语句将导致放弃对当前输入记录的所有进一步处理。如果下一条语句出现或在 BEGIN 或 END 操作中被调用,则行为未定义。
于 2013-07-04T19:20:30.087 回答
19

只是为了缩短...

% awk 'NR>1{print $1-p} {p=$1}' file
1
2
0
6
于 2013-07-04T19:33:21.040 回答
4

如果 awk 不是严格要求,则 shell 解决方案:

set -- $(< file)
p=$1; shift; while (($# > 0)); do echo $(($1 - p)); p=$1; shift; done

干燥机

set -- $(< file)
while (($#>0)); do [[ -n $p ]] && echo $(($1-p)); p=$1; shift; done
于 2013-07-04T20:15:42.263 回答
3

GNU

$awk '{p=f;f=$1} NR>1{print fp}' 文件
1
2
0
6
于 2013-07-04T19:25:59.113 回答