有条件地从文件中删除一行

mkc*_*mkc 3 sed awk

在一个看起来像这样的文件中:

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
Run Code Online (Sandbox Code Playgroud)

如果第一行的数字与最后一行的第一列之间的差异大于 10,则删除最后一行。因此,在这种情况下,由于560 - 549.432086168大于 10 ,最后一行将被删除。

关于如何有效地做到这一点的任何建议?

Sté*_*las 7

典型工作awk

awk 'NR == 1 {first = $1}; $1 - first <= 10' < file
Run Code Online (Sandbox Code Playgroud)

或者仅对最后一行执行此操作:

awk 'NR == 1 {first = last = $0; next}
     {print last; last = $0}
     END {if (NR && last - first <= 10) print last}' < file
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 5

您可以使用perl

perl -lne '
  $n = $_ if $. == 1;
  print unless eof;
  print if $_ - $n <= 10 and eof;
' <file
Run Code Online (Sandbox Code Playgroud)
  • 对于第一行$. == 1,我们将其值设置为变量$n
  • 对于下一行,如果它不是最后一行,则打印
  • 如果第一列与$n小于或等于 10之间的差异,则打印最后一行。

在这里,我们使用$_ - $n, 强制数字上下文中的最后一行,因此使用了第一列值:

$ perl -le 'print "5.6000E+02 7.0997e-06 -3.7538E-04"-0'
560
Run Code Online (Sandbox Code Playgroud)