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