在一个看起来像这样的文件中:
549.432086168
0.0000E+00 9.6988e-04 2.0580E-02
1.0000E+01 9.6988e-04 2.0580E-02
2.0000E+01 9.6988e-04 2.0580E-02
.
.
.
5.6000E+02 7.0997e-06 -3.7538E-04
如果第一行与最后一行第一列的数字之差大于 10,则删除最后一行。因此,在这种情况下,最后一行将被删除,因为560 - 549.432086168
大于 10。
关于如何有效地完成此操作有什么建议吗?
答案1
典型工作awk
:
awk 'NR == 1 {first = $1}; $1 - first <= 10' < file
或者只对最后一行执行此操作:
awk 'NR == 1 {first = last = $0; next}
{print last; last = $0}
END {if (NR && last - first <= 10) print last}' < file
答案2
您可以使用perl
:
perl -lne '
$n = $_ if $. == 1;
print unless eof;
print if $_ - $n <= 10 and eof;
' <file
- 对于第一行
$. == 1
,我们将其值设置为变量$n
- 对于下一行,如果不是最后一行,则打印
- 如果第一列之间的差值
$n
小于或等于 10,则打印最后一行。
这里我们使用了$_ - $n
,强制在数字上下文中使用最后一行,因此使用了第一列值:
$ perl -le 'print "5.6000E+02 7.0997e-06 -3.7538E-04"-0'
560