最初の行をスキップして特定の形式で列を印刷し、下でいくつかの算術を実行するにはどうすればよいですか?次は大丈夫ですか?
入力する
#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
「レコード数」を表し、基本レコード区切り文字(改行)が使用されていると仮定すると、これも行数です。最初の行(この場合)には番号が付けられています1
。NR
大きい場合、中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
とにかく丸められます。浮動小数点数を使用する関数は、最も近い整数に丸められます。最大誤差はです。上の数値を四捨五入すると誤差は です。だから一つは一つです。3
0.7
0.5
3.7
4
0.3
0に向かって四捨五入の近似値は次のとおりです。最も近い整数に丸める。 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 を使用するので、対応する条件が各ファイルに順番に適用されます。