次の表があります。
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%のしきい値を決定します。他のレコードでは、フィールドがしきい値以上であるかどうかに基づいて0
5番目のフィールドを設定します。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
答え2
たぶん最初に並べ替えることができます。
cat FileName.txt | sort -r -n -k5 | head