我有下表:
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