Eu tenho uma mesa que parece
'a;b;f|d;e;c|g;h'
que desejo classificar pela terceira coluna. A saída deve ser
'g;h|d;e;c|a;b;f'
Se eu usasse os delimitadores padrão whitespace
, newline
isso poderia ser feito usando standard sort
:
printf '%b' 'a b f\nd e c\ng h' | sort -k 3
produziria
g h
d e c
a b f
O sort
comando também pode usar um separador de campo não padrão com a -t
opção:
printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'
produziria
g;h
d;e;c
a;b;f
No entanto, não consegui encontrar uma maneira de classificar uma tabela com um newline
separador sem registros.
Isso pode ser conseguido? Se sim, como?
Editar
Uma condição fundamental é não alterar dados nem delimitadores no processo, apenas a ordem em que aparecem.
Outras ferramentas além do sort
comando também estão ok. De preferência compatível com POSIX, mas não necessariamente.
Responder1
O comando sort só pode classificar registros de entrada delimitados por nova linha ou caractere NUL conforme indicado no manual
O utilitário sort classifica arquivos de texto e binários por linhas. Uma linha é um registro separado do registro subsequente por uma nova linha (padrão) ou caractere NUL '\0'
Então sua transformação em algum momento precisaria conhecer o conhecimento do delimitador de registros (no seu caso |
) para chegar ao resultado desejado. Quaisquer outros comandos (Awk/Perl ou datamash) precisariam fazer essa suposição
Não com uma única ferramenta independente, mas com tr
, sort
e paste
você poderia fazer isso. Você pode ver como a transformação está tomando forma adicionando um comando por vez ao pipeline
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -