Podemos trapacear e substituir o caractere separador por outro (por exemplo, o caractere NUL) que permitiria a classificação "nativa" funcionar e, em seguida, defini-lo novamente.
por exemplo
tr x 'tr x 'ab | def
abc | def
0' < file.txt | LANG=C sort | tr 'abc | def
abc | ghi
0' x
0' < file.txt | sort | tr 'tr x 'tr x 'ab | def
abc | def
0' < file.txt | LANG=C sort | tr 'abc | def
abc | ghi
0' x
0' < file.txt | sort | tr '%pre%0' x
0' x
Agora, talvez seja necessário ter cuidado com o impacto local na encomenda, por isso talvez seja necessário fazer
%pre%Isso só funciona enquanto os dados não tiverem NULs!
Como isso funciona pode ser explicado mais facilmente com uma tabela formatada:
Precisamos comparar duas linhas:
%pre% Definimos o separador como NUL e comparamos ab<NUL>def
a abc<NUL>def
. O <NUL>
vem antes de c
e, portanto, classificamos corretamente no primeiro campo.
Agora vamos dizer que o primeiro campo corresponde e o segundo campo é diferente
%pre% Agora, comparamos abc<NUL>def
a abc<NUL>ghi
. Temos uma correspondência entre o primeiro campo e o separador e agora estamos classificando no segundo campo.