2

次のようなタブ区切りファイルがあります。

foo 0 4

boo 3 2

blah 4 0

flah 1 1

各行の2つの列の間のlog2を計算しようとしています。私の問題はゼロ除算にあります私が試したことはこれです:

cat file.txt | awk -v OFS='\t' '{print $1, log($3/$2)log(2)}' 

分母がゼロの場合、awkはクラッシュします。私がやりたいのは、分母が0の場合に結果として「inf」を出力する、ある種の条件文です。

私はこれについてどうやって行くのか本当にわかりませんか?助けていただければ幸いですありがとう

4

2 に答える 2

2

次のように実装できます(いくつかの追加の調整が必要です)。

awk 'BEGIN{OFS="\t"} {if ($2==0) {print $1, "inf"} else {print $1, log($3/$2)log(2)}} file.txt

説明:

  • if ($2==0) {print $1, "inf"} else {...}$2-最初に、2番目のフィールド( )がゼロかどうかを確認します。その場合は、印刷$1infて次の行に進みます。それ以外の場合は通常どおり続行します。
  • BEGIN{OFS="\t"}OFS-awkスクリプト内に設定します。主に好みのもの。
  • ... file.txt--awkは、引数として指定するとファイルから読み取ることができます。これにより、猫のプロセスを節約できます。(UUCAを参照)
于 2012-12-03T16:41:03.250 に答える
1
awk -F'\t' '{print $1,($2 ? log($3/$2)log(2) : "inf")}' file.txt
于 2012-12-03T17:11:10.820 に答える