Linux classifica a última coluna

Linux classifica a última coluna

Estou executando um script (sobre o qual não tenho controle) para obter a seguinte saída. Quero classificar pela última (3ª) coluna. Cada coluna é separada por espaços e a 2ª 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

Tentei usar sort -k, mas não funcionou. Então eu encontrei esta pergunta -Como classificar numéricamente pela última coluna?- a solução fornecida é

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

Minha dúvida é: como faço para aproveitar isso ao executar o script?

    > ./script | <something??>

Obrigado.

Responder1

Estranho

Você pode adaptar o tubo vinculado de maneira simples:

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

Na awkexpressão $xfaz referência à x-ésima coluna da linha atual (começando com 1) - e a variável predefinida NFarmazena o número de colunas da linha atual, print $NF,$0imprimindo assim para cada linha a última coluna e a linha completa (porque $0denota o completo linha). O cutcomando então gera a segunda até a última coluna de cada linha.

A -k1,1parte de classificação significa que apenas a primeira coluna é usada como chave de classificação - isso só faz diferença quando mais de uma linha tem o mesmo valor na primeira coluna. Sem -k1,1as colunas a seguir influenciará a ordem relativa (como chave de classificação secundária e assim por diante) nesse caso. Somente -k1,1a 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

Alternativamente, você pode resolvê-lo via sorte sed:

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

Onde a nova linha no final da primeira linha é escapada \- você pode removê-la \e inserir o tubo como uma linha.

A ideia é primeiro mover a última coluna para a frente, ordenar pela primeira coluna e depois colocá-la novamente atrás.

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

As sedexpressões fazem a troca através de referências de grupo (por exemplo, \2 \1) - os grupos são marcados no padrão através de parênteses de escape:\(...\)

informação relacionada