仅当大于上一行时,如何反向减去行

仅当大于上一行时,如何反向减去行

我正在编写一个 shell 脚本,它将反向读取文件的行。我需要它从后者中减去前一行,但前提是后者较大。如果它更小,那么我只想要该行上的数字。

例子:

文件内容:

100
200
300
100
300

结果应该是:

200     # line 5 - line 4    
100     # line 4 (as it's < line 3) 
100
100

我使用的代码只是减去之前的行(不考虑值是否 >= )是:

awk 'p{print $0-p}{p=$0}' inputfile > outputfile

我仍然需要这样做,但前提是值大于前一行。

我正在考虑使用 while read 循环,但是为每一行分配一个变量进行比较,或者类似的东西,真的很费脑力。提前致谢!

答案1

tac对于反转文件的行顺序很有用 - (BSD 也tail -r可以反转行顺序)

tac file | awk 'p { if( p>$1 ) print p-$1; else print p } { p=$1 }' 

如果由于某种原因,您不能使用tac或想要专门使用 awk,则可以awk通过数组将整个文件读入内存,并END{}以相反的顺序处理该数组。

awk '{ r[i++]=$0};  END{ for(i=i-1; i>=0; i--) 
       if( r[i+1] ) if( r[i+1]>r[i] ) print r[i+1]-r[i]; else print r[i+1] 
     }' file

答案2

您可以使用tac反转文件然后awk进行计算。我修改了你的file,使线条更加随机。

$ cat file
101
220
303
140
305
$ tac file | awk '{if(last>$0)print last-$0;else print last;last=$0}END{print last}'

165
140
83
119
101

两点备注:

  • 毕竟,如果不需要,您需要删除第一行(空行)。
  • 在该END{}块中,打印文件的第一行,如果不需要,请删除该块。

相关内容