亲爱的生物信息学家,
我在awk和科学值表示法上有一个问题。
我想使用awk根据$5的最小值选择行,只保留$1的一个ID::
Chrpa1_10100 2434 PF00063 des 3.9E-21 IPR001609
Chrpa1_10100 2434 PF03547 des 4.5E-7 IPR004776
Chrpa1_10100 2434 PF07857 des 3.3E-7 IPR012435
Chrpa1_10100 2434 PF13516 des 0.085 IPR001611
在这个例子中,我想要:
Chrpa1_10100 2434 PF00063 des 3.9E-21 IPR001609
如果我做:
cat file |sort -k1,1|uniq| awk -F't' '$5 > max[$1] { max[$1]=$5; row[$1]=$0 } END { for (i in row) print row[i] }'
但是我想要这个:
Chrpa1_10100 2434 PF13516 des 0.085 IPR001611
提前谢谢你
欢呼我的命令行给我这个:Chrpa1_10100 2434 PF13516 des 0.085IPR001611,但我想要这个Chrpa1_10100 2434 PF00063 des 3.9E-21IPR001609
下列数字
3.9E-21 4.5E-7 3.3E-7 0.085
3.9E-21
最小,0.085
是最大的,这段代码
awk -F't' '$5 > max[$1] { max[$1]=$5; row[$1]=$0 } END { for (i in row) print row[i] }'
选择最大的数,因此与0.085
一致。如果您想要3.9E-21
,您需要实现查找最小值,但请记住,虽然未知的平均零对于查找正数的最大值很好,但它不是最小值,因此我建议以下改进
awk -F't' '!($1 in min)||($5 < min[$1]){ min[$1]=$5; row[$1]=$0 } END { for (i in row) print row[i] }'
解释:改变max
min
>
<
和改变条件是真的如果没有关键$1
$5
数组或价值小于最小值在min
关键$1
。
当file.txt
内容为
Chrpa1_10100 2434 PF00063 des 3.9E-21 IPR001609
Chrpa1_10100 2434 PF03547 des 4.5E-7 IPR004776
Chrpa1_10100 2434 PF07857 des 3.3E-7 IPR012435
Chrpa1_10100 2434 PF13516 des 0.085 IPR001611
然后
awk '!($1 in min)||($5 < min[$1]){ min[$1]=$5; row[$1]=$0 } END { for (i in row) print row[i] }' file.txt
给输出
Chrpa1_10100 2434 PF00063 des 3.9E-21 IPR001609
(在gawk 4.2.1中测试)