
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 awk
expressão $x
faz referência à 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, print $NF,$0
imprimindo assim para cada linha a última coluna e a linha completa (porque $0
denota o completo linha). O cut
comando então gera a segunda até a última coluna de cada linha.
A -k1,1
parte 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,1
as colunas a seguir influenciará a ordem relativa (como chave de classificação secundária e assim por diante) nesse caso. Somente -k1,1
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
Alternativamente, você pode resolvê-lo via sort
e 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 sed
expressõ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:\(...\)