トリム機能

トリム機能

最初の行をスキップして特定の形式で列を印刷し、下でいくつかの算術を実行するにはどうすればよいですか?次は大丈夫ですか?

入力する

#filename
4e+06 5e+06 6e+06 
5e+06 5e+06 6e+06

パスワード:

BEGIN { CONVFMT="%0.17f" }
function t(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+2) : n)
}
FR>1 {print t($1-1000),t($2)}

答え1

私はawkスクリプトの最後の行にタイプミスをしました。住所FNRの代わりに読む必要があります。FR

BEGIN { CONVFMT="%0.17f" }

function t(n, s) {
   s=index(n,".")
   return (s ? substr(n,1,s+2) : n)
}

FNR>1 {print t($1-1000),t($2)}

ここでは期待どおりに動作します。

タイプミスのため、アドレスはFR>1どのデータ行とも一致しません。FRは定数で、条件はFR>1常に false です。そのため、出力は得られません。

答え2

最初の行をスキップする方法はいくつかあります。

NR>1{ … }            # For every record after the first.
BEGIN{ getline }     # Only on the start, read the first line
!var{var=1;next}     # If var is unset, set it and skip one line.
FNR>1{ … }           # For records after the first for every file listed.

この変数はNR「レコード数」を表し、基本レコード区切り文字(改行)が使用されていると仮定すると、これも行数です。最初の行(この場合)には番号が付けられています1NR大きい場合、中1かっこ内で実行される内容は、最初の行以降にのみ実行されます。

代わりに、変数はFNRコマンドライン()にリストされている各ファイルのレコード番号が0にリセットされたことを示しますawk 'script' file1 file2 filen …。これはNR>1すべての新しいファイルとまったく同じですが、リセットされます。

トリム機能

また、ご意見に応じて、「数字を小数点以下2桁まで切り捨てる」という目標を持つ関数定義がありますが、t(n,s)これを正しく実行しません。

関数定義に点を見つけるための命令があります。点が小数点区切り記号であると仮定します。

s=index(n,".")

次に、(文字列として)その点の後ろの2つの文字フィールドの文字列を切り捨てます。指数を持たない数字の場合、小数は正しく切り捨てられましたが、数字は指数を使用しています(例:)1.2345678e3。もちろん、小数点以下2桁まで正確に切る1.23のとは異なります1234.56

数値を正しく切り取るには、指数を考慮する必要があります。このint関数は正確に次のことを行います。

function ti(n){ return( int(100*n)/100 ) }

ただし、浮動小数点数に適用される近似値をよりよく使用できます。

function tf(n){ return( sprintf( "%.2f",n ) ) }

近似度合い(実際のタイプ)が異なります。 intを使用する関数は、ゼロに向かってより小さい整数(正の場合)に丸められます。などの数字の場合、エラーは3.7とにかく丸められます。浮動小数点数を使用する関数は、最も近い整数に丸められます。最大誤差はです。上の数値を四捨五入すると誤差は です。だから一つは一つです。30.70.53.740.30に向かって四捨五入の近似値は次のとおりです。最も近い整数に丸める。 1つの最大エラーは0.9、もう1つの最大エラーはです0.5。浮動小数点近似の唯一の奇妙なことは、時には丸められ、0.5時には0.5丸められることです。これは丸めと丸めのバランスをとるためです。

当然、0.1、0.2、0.3、0.4はゼロに下げなければなりません。
これにより、0.1、0.2、0.3、および0.4のエラーが発生します。
しかし、0.9、0.8。 0.7と0.6は1に丸められます。
これにより、-0.1、-0,2、-0.3、-0.4のエラーが発生します。

これらのすべてのエラー(任意の入力の平均エラー)はバランスがとれています。

ただし、常に0.5に丸めた場合、0.5の連続エラーが発生します。

バランスを取るために一度下げると、次回は降ります。
または、通常は次のように書かれます。円形関係(0.5)は偶数です。

printf '%s ' $l; echo; printf '%-3.0f ' $l; echo
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 
0   0   0   0   0   1   1   1   1   1   1   1   1   1   2   2   2   2   2   2

0.5丸め0(切り上げ)と1.5丸め2(切り上げ)に注意してください。

正確

CONVFMT="%.16g"浮動小数点数を変換するための形式で使用する必要があります。

形式は、f次のように有効数字を削除します。

$ awk 'BEGIN{var=1.23456789e-8;printf "%.9f\n",var}'
0.000000012

有効数字は2つだけです。むしろ形式は次のとおりですg

$ awk 'BEGIN{var=1.23456789e-8;printf "%.9f\n",var}'
1.23456789e-08

9つの有効数字(数字)が保持されます。

ファイル名

これは、複数のファイルに適用されるawkコマンドに役立ちます。たとえば、次のようになります。

$ awk 'FNR>1{print $1}' file1 file2 file3

NR の代わりに FNR を使用するので、対応する条件が各ファイルに順番に適用されます。

関連情報