如何打印一列中前五个最高的数字?

如何打印一列中前五个最高的数字?

我有一个包含四列的文本文件。我需要读到文件末尾并打印第 3 列中的最高数字(前 5 个值)以及第 1 列。

输入.txt

xm|340034177|ref|RT_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  2607    0
xm|75755638|ref|RT_557407.1|    153821  1937    0
xm|108773031|ref|RT_678101.1|   161452  1688    0
xm|30352011|ref|RT_784766.1|    150568  105 0

输出.txt

xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

答案1

sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7

上面的命令将在第三个字段上对文件进行排序。现在,我将此输出通过管道传输到tail命令以打印第三列中的前 5 个数字。但是,如果您只需要输出中的第一列和第三列,则可以将输出通过管道传输到cut命令。

测试

cat filename

T_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  2607    0
xm|75755638|ref|RT_557407.1|    153821  1937    0
xm|108773031|ref|RT_678101.1|   161452  1688    0
xm|30352011|ref|RT_784766.1|    150568  105 0
T_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  607    0
xm|75755638|ref|RT_557407.1|    153821  937    0
xm|108773031|ref|RT_678101.1|   161452  1881    0
xm|30352011|ref|RT_784766.1|    150568  1051 0

现在,我对此文件运行上述命令。

sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7

我得到的输出是

xm|30352011|ref|RT_784766.1|  1051
xm|108773031|ref|RT_678101.1| 1688 
xm|108773031|ref|RT_678101.1| 1881 
xm|75755638|ref|RT_557407.1|  1937
xm|161622288|ref|RT_340093.1| 2607 

编辑

如果文件中有浮点数和负数,您也可以添加 -g 标志。该命令看起来像,

sort -k3ng,3 filename | tail -5 | cut -d " " -f1,6-7

答案2

您可以在处理文件之前对文件进行排序awk

$ sort -rnk3 file | awk 'FNR < 6 {print $1,$3}' OFS="\t"
xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

或者您可以perl单独使用来完成这项工作:

$ perl -anle '
    push @a, [$F[0],$F[2]];
    END {
        $" = "\t";
        print "@$_" for (sort { $b->[1] <=> $a->[1] } @a)[0..4];
    }
' file
xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

相关内容