如何使用awk仅打印在某个字段具有最小值的匹配项?

如何使用awk仅打印在某个字段具有最小值的匹配项?,awk,minimum,Awk,Minimum,我试图解析HMMER给出的一些结果,在tblout文件中,我能够分离出我想要的匹配项 尽管如此,如果同一个值仅与一个概要文件匹配,则会重复多次 例如,这是重复3次的一次读取: SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4 SRR6033660.1458607 FAM019859 2.5e-12 2.7e-12 55.0 54.9 SRR6033660.1458607 FAM015326 4e-14 4.2e-14 58.8 58.7 SR

我试图解析HMMER给出的一些结果,在tblout文件中,我能够分离出我想要的匹配项

尽管如此,如果同一个值仅与一个概要文件匹配,则会重复多次

例如,这是重复3次的一次读取:

SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.1458607 FAM019859 2.5e-12 2.7e-12 55.0 54.9
SRR6033660.1458607 FAM015326 4e-14 4.2e-14 58.8 58.7
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
它匹配3个族,但我只想选择e值最低的行(第3列和第4列)

如何编写一个awk命令来提供此输出

SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5

谢谢

对于两个字段选择最小值通常不起作用,这里我建议使用线性组合,您可以在其中设置权重

$ awk -v a=0.5 '{c=a*$3+(1-a)*$4}
        !($1 in min) || c<min[$1]{min[$1]=c; minLine[$1]=$0}
         END{for(k in minLine) print minLine[k]}' file | column -t

SRR6033660.1458607  FAM000764  7.5e-25  8.1e-25  94.6  94.5
SRR6033660.161030   FAM007172  4e-15    4.2e-15  63.4  63.4
$awk-va=0.5'{c=a*$3+(1-a)*$4}

!(每分钟1美元)| | c选择两个字段的最小值通常不起作用,这里我建议使用线性组合,您可以在其中设置权重

$ awk -v a=0.5 '{c=a*$3+(1-a)*$4}
        !($1 in min) || c<min[$1]{min[$1]=c; minLine[$1]=$0}
         END{for(k in minLine) print minLine[k]}' file | column -t

SRR6033660.1458607  FAM000764  7.5e-25  8.1e-25  94.6  94.5
SRR6033660.161030   FAM007172  4e-15    4.2e-15  63.4  63.4
$awk-va=0.5'{c=a*$3+(1-a)*$4}

!(每分钟1美元)| | c这是
$3
$4
的总和,总和最小的e值最低(在没有更好的定义的情况下):


这加起来是
$3
$4
,总和最小的e值最低(在没有更好的定义的情况下):


其他人提供了纯awk解决方案。请注意,它们实际上涉及将数据的全部内容加载到内存中。这在一般情况下是有问题的

事实证明,sort(特别是gnucoreutils版本,不确定其他版本)足够聪明,可以在处理大量数据时使用临时文件。它还可以比较以浮点形式指定的数字

因此:


其他人提供了纯awk解决方案。请注意,它们实际上涉及将数据的全部内容加载到内存中。这在一般情况下是有问题的

事实证明,sort(特别是gnucoreutils版本,不确定其他版本)足够聪明,可以在处理大量数据时使用临时文件。它还可以比较以浮点形式指定的数字

因此:


LC\u NUMERIC=C排序如果有A1==B1的A行和B行,其中A3>B3但B4>A4,您想要什么?您的问题向我们展示了您迄今为止所做的尝试。如果您有A1==B1的A行和B行,其中A3>B3,但B4>A4,您想要什么?你的问题向我们展示了你迄今为止的努力。
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
SRR6033660.1458607 FAM000764 7.5e-25 8.1e-25 94.6 94.5
SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
SRR6033660.161030 FAM007172 4e-15 4.2e-15 63.4 63.4
LC_NUMERIC=C sort <TBLOUT -k1 -k3g -k4g | awk 't!=$1{t=$1;print}'