投稿

ラベル(awk)が付いた投稿を表示しています

awkオーバーフロー

awkの数値比較は1e-308あたりでおかしくなるらしい。 https://lists.gnu.org/archive/html/bug-gawk/2015-04/msg00011.html 上記を参考にすると、1e-308を下回りそうな値については0を足すことで0と判定させることができ、この値と比較することで正しい数値比較ができる。 たとえば、ある値が1e-6以下なら表示させたいとする。しかし、この中に1e-308より小さいのがあると漏らす。 間違う例(1e-6以下なら表示したい) >> echo 1e-666 | awk '{if($1<1e-6) {print $1}}' 正しく判定できる例 >> echo 1e-666 | awk '{if(!($1+0)<1e-6) {print $1}}' 1e-666

vcfのINFOのparse

ワンライナー extract () { cat $1 | awk -v regex="$2=([-|.|e|0-9]+);" \ '{match($8, regex, arr);\ if(length(arr)==0){print "NA"} else {print arr[1]}} ' } とかにするとよろしい。 for var in AC AF AN BaseQRankSum ; do extract oreno.vcf $var > $var.txt done たぶん遅い。

awkで最大値・最小値

以下のようにして実装できる。関数の定義と三項演算子の使用がポイント。 echo "6 5 " | awk ' function max(a, b) { return a>b ? a : b } {print max($1, $2)} ' シングルクオートの中は改行しようと ; があろうとなかろうとどうでも良い。