awkを使用して比率を計算する

awkを使用して比率を計算する
awk 'NR==1{$4="ratio"}NR>1{$4 = ($3)/($2)} {print $1 "\t" $2 "\t" $3 "\t" $4}' A  B

awk:コマンド。行:1:(FILENAME = A FNR = 18)致命的:0で除算しようとしました。

このエラーを解決するのに役立つ人がいますか?

NR==1ここで合計はどういうNR>1意味ですか?それは奇妙な例です。わかりません。 NRがレコード番号であることはわかりますが、ここではなぜ使用しますか?

ベストアンサー1

作成者の例では、ファイルAとBを次の形式で想像しているようです。

ファイルA:

X Y Z
1 2 3
4 5 6

ファイルB:

6 7 8
o o 0

AWKの例では、4番目の列を生成します。ここで、NRは現在AWKによって処理されている行を表します。最初の行では、4番目の引数を文字列「ratio」(列名)に設定し、後続のすべての行では、4番目の引数を2番目の引数で割った3番目の引数に設定します。結果:

awk 'NR==1{$4="ratio"}NR>1{$4 = ($3)/($2)} {print $1 "\t" $2 "\t" $3 "\t" $4}' A
X   Y   Z   ratio
1   2   3   1.5
4   5   6   1.2
6   7   8   1.14286
1   2   3   1.5

発生したエラーは次のとおりです。

awk:コマンド。行:1:(FILENAME = A FNR = 18)致命的:0で除算しようとしました。

ファイルAの18行目に2列と3列の数字が含まれていることを確認してください。

sedを使用して 'o'文字を0に変換できます。

cat A B | sed 's/\bo\b/0/g'

列 2 が 0 であることを確認し、それに応じてアクションを取ることができます。

awk 'NR==1{$4="ratio"}NR>1{if($2==0) $4 = "N/A"; else $4 = ($3)/($2)}

まとめると、次のような利点が得られます。

cat A B | sed 's/\bo\b/0/g' | awk 'NR==1{$4="ratio"}NR>1{if($2==0) $4 = "N/A"; else $4 = ($3)/($2)} {print $1 "\t" $2 "\t" $3 "\t" $4}'
X   Y   Z   ratio
1   2   3   1.5
4   5   6   1.2
6   7   8   1.14286
0   0   0   N/A

おすすめ記事