Como imprimir os cinco números mais altos de uma coluna?

2

Eu tenho um arquivo de texto com quatro colunas. Eu preciso ler até o final do arquivo e imprimir o maior número da coluna 3 (top 5 valores), juntamente com a coluna 1.

input.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

output.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
    
por jack 12.06.2014 / 03:55

2 respostas

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

O comando acima classificará o arquivo no 3º campo. Agora, estou canalizando essa saída para o comando tail para imprimir os 5 primeiros números na terceira coluna. No entanto, se você precisar apenas da primeira coluna e desta terceira coluna na saída, poderá canalizar a saída para o comando cut .

Teste

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

Agora, eu corro o comando acima neste arquivo.

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

A saída que recebo é

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 

EDITAR

Você pode adicionar o sinalizador -g para números flutuantes e negativos, caso você tenha algum em seu arquivo. O comando seria semelhante,

sort -k3ng,3 filename | tail -5 | cut -d " " -f1,6-7
    
por 12.06.2014 / 04:03
3

Você pode classificar o arquivo antes de processá-lo com 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

Ou você pode usar perl sozinho para fazer o trabalho:

$ 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
    
por 12.06.2014 / 04:00

Tags