列で上位2%の値を選択し、真の場合は1、偽の場合は0を書きます。

列で上位2%の値を選択し、真の場合は1、偽の場合は0を書きます。

次の表があります。

CHR BP  SNP CM  AN1
1 15558213 rs2845371 0 -1.10837716961610
1 15558230 rs16981507 0 -1.13721847993853
1 15558586 rs5993924 0 -1.34239265871644
1 15563103 rs3016111 0 -1.61194237184708

5列の値のうち上位2%を選択して真なら1、偽なら0を書きたいと思います。

if...elseコマンドを使用する必要があるようです。しかし、最初の行を定義する方法がわかりません(col5 = top2%の場合)。

if col5= top2%
then
awk '{$5=1 ; print ;}' file
else
awk '{$5=0 ; print ;}' $file
fi

この問題を解決する方法をご案内いただきありがとうございます。

ベストアンサー1

awk '
  PASS==1{
    if (FNR==2){ min=max=$5; next }
    min=($5 < min ? $5 : min)
    max=($5 > max ? $5 : max)
    next
  }
  FNR==1{ threshold=(max - ((max - min) / 50)) }
  FNR>1 { $5=($5 >= threshold) }
  1
' PASS=1 file PASS=2 file

2 つのステップで入力ファイルを読み込みます。

1次パス:5番目のフィールドの最小値と最大値を決定します。
2番目のパス:最初のレコード値の上位2%のしきい値を決定します。他のレコードでは、フィールドがしきい値以上であるかどうかに基づいて05番目のフィールドを設定します。1その後、記録を印刷します。

出力:

CHR BP  SNP CM  AN1
1 15558213 rs2845371 0 1
1 15558230 rs16981507 0 0
1 15558586 rs5993924 0 0
1 15563103 rs3016111 0 0

おすすめ記事