如何从一列中选择前 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

分两遍读取输入文件。

第一遍:确定第 5 个字段的最小值和最大值。
第二遍:确定第一条记录中前 2% 值的阈值。在任何其他记录上,将第 5 个字段设置为0或 ,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

相关内容