列で最初の5つの最も高い数字を印刷するには?

列で最初の5つの最も高い数字を印刷するには?

4つの列を持つテキストファイルがあります。ファイルの最後まで読んで、列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

上記のコマンドは、3番目のフィールドのファイルをソートします。次に、この出力をtail3番目の列の最初の5つの数字を印刷するコマンドにパイプします。ただし、出力に最初と3番目の列だけが必要な場合は、出力を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

関連情報