如何计算两个相邻字段之间的值差

时间:2018-10-03 14:52:37

标签: bash awk

我正在尝试计算两个相邻字段之间的距离。我的输入文件如下。

  

1 11160 11533 11556 11731 11822 11870 12149 12411 12461 12686 12829 13315 13420 ....

在输出中,我想保留第一个字段,而下一个字段将是当前字段和下一个字段$2=$3-$2$3=$4-$3 ...

完整的输出如下:

  

1373 23 175 91 48 279 262 50 225 143 486 105 ...

我该怎么做?

在我的代码中,每个值都打印为新行,数字也反向打印。

BEGIN {FS=" "}
{
        out[1]=$1
        for (i=2;i<=NF-1;i++) 
                out[i]=$(i+1)-$i
}
END{
        for (i in out)
               print out[i]
}

这里是电流输出

  

373   23   175   91   48   279   262   50   225   143   486   105   1

4 个答案:

答案 0 :(得分:2)

编辑: 在注释部分中也添加了anubhava先生建议的代码。

awk '{s=$1; for (i=2; i<NF; i++) s = s OFS $(i+1) - $i; print s}' Input_file

请您尝试以下。

awk '{printf $1 OFS;for(i=2;i<NF;i++){printf("%d%s",$(i+1)-$i,i==(NF-1)?ORS:OFS)}}' Input_file

输出如下。

1 373 23 175 91 48 279 262 50 225 143 486 105

说明: 也在此处添加说明。

awk '
{
  printf $1 OFS                                 ##Printing first field and OFS(whose value is space by default).
  for(i=2;i<NF;i++){                            ##Starting for loop from value of 2 to till NF-1 value where NF is number of field in current line.
    printf("%d%s",$(i+1)-$i,i==(NF-1)?ORS:OFS)  ##Printing diffrence of next field and current field and checking condition for 2nd print if i==NF-1 then new line else print space for that line.
  }                                             ##Closing for loop block here.
}
' Input_file                                    ##Mentioning Input_file name here.

答案 1 :(得分:1)

awk '{printf("%d",$1); for (i=2;i<NF;i++) printf(" %d",$(i+1)-$i)}' file

输出:

1 373 23 175 91 48 279 262 50 225 143 486 105

答案 2 :(得分:1)

另一个awk

$ awk -v RS=' ' 'NR!=2{printf "%s ", $0-p} {p=$0}' file

1 373 23 175 91 48 279 262 50 225 143 486 105

您可能要添加最后一个\n

您的规范对应于显示所有成对的差异期望第二个差异,这就是为什么有NR!=2代码的原因。第一个字段与0进行比较,因此保持不变。

答案 3 :(得分:0)

您几乎拥有了!只需将输出从print out[i]更改为:

printf out[i] " "

printf不会在每次迭代后添加换行符,而是在空格处加上

我从上述调整中收到的输出变为:

1 373 23 175 91 48 279 262 50 225 143 486 105 

就“没有意义的数字”而言,它们与您期望的一样,是连续数字之间的差异。