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: \(...\)