次のファイルから:
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