Classificando uma tabela com um separador de registros sem nova linha no bash

Classificando uma tabela com um separador de registros sem nova linha no bash

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, newlineisso 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 sortcomando também pode usar um separador de campo não padrão com a -topçã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 newlineseparador 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 sortcomando 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, sorte pastevocê 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'|' -

informação relacionada