我正在编写一个 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{}
块中,打印文件的第一行,如果不需要,请删除该块。