使用AWK在同一列中的数字之间的差异

时间:2013-07-04 19:13:43

标签: linux shell ubuntu awk

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

1
2
4
4
10

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

1
2
0
6

我该怎么做?

4 个答案:

答案 0 :(得分:17)

请尝试以下代码:

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中调用,则行为未定义     动作。

答案 1 :(得分:16)

只是为了缩短......

% awk 'NR>1{print $1-p} {p=$1}' file
1
2
0
6

答案 2 :(得分: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

答案 3 :(得分:3)

GNU代码

$awk '{p=f;f=$1} NR>1{print f-p}' file
1
2
0
6