Linux classifica última coluna

4

Estou executando um script (que não tenho controle) para obter a saída a seguir. Quero classificar pela última (terceira) coluna. Cada coluna é separada por espaços e a segunda coluna inclui espaços / símbolos.

    > ./script
    37622       (this is || test1)&&(SGD||HKD||RMB)     40010
    43944       (this is)&&(SGD||HKD)    102732
    79378       (this is||test2)&&(HKD||RMB)    205425
    457000      (test2) && (SGD||RMB||HKD||YEN)        71
    559658      (test1||test2)&&(RMB||YEN||SGD)     14043

Eu tentei usar o tipo -k, mas não funciona. Então eu encontrei esta pergunta - Como classificar numérica pela última coluna? - a solução fornecida é

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

Minha pergunta é: como faço uso disso quando executo o script?

    > ./script | <something??>

Obrigado.

    
por user11496 16.03.2012 / 02:44

1 resposta

5

Awk

Você pode adaptar o canal vinculado de uma forma direta:

$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '

Em awk , a expressão $x referencia a x-ésima coluna da linha atual (começando com 1) - e a variável predefinida NF armazena o número de colunas da linha atual, portanto print $NF,$0 imprime para cada linha, a última coluna e a linha completa (porque $0 indica a linha completa). O comando cut , então, envia a segunda para a última coluna de cada linha.

A parte -k1,1 da classificação significa que somente a primeira coluna é usada como chave de classificação - isso só faz diferença quando mais de uma linha tiver o mesmo valor na primeira coluna. Sem -k1,1 , as colunas a seguir influenciarão a ordem relativa (como chave de classificação secundária e assim por diante) nesse caso. Com -k1,1 apenas a primeira coluna é usada como chave de classificação - e a ordem relativa das linhas com a mesma chave não é alterada (ou seja, uma classificação estável é executada).

sed

Como alternativa, você pode resolvê-lo por meio de sort e sed :

$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/ /' | \
     sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/ /'

Onde a nova linha no final da primeira linha é escapada via \ - você pode remover esse \ e inserir o pipe como uma linha.

A idéia é primeiro mover a última coluna para a frente, classificar pela primeira coluna e depois colocá-la de volta.

Supõe-se que a última coluna esteja separada por meio de espaço em branco, ou seja, [ \t]\+ (espaços ou tabulações).

As expressões sed fazem a troca por meio de referências de grupo (por exemplo, ) - os grupos são marcados no padrão por meio de parênteses de escape: \(...\)

    
por 16.03.2012 / 09:11

Tags