Acho que você não precisa se concentrar tanto no delimitador quanto na sort -k
eys. Você pode especificar um intervalo de caracteres para suas chaves.
info sort
...given the input line ' foo bar', sort
breaks it into
fields ' foo' and ' bar'. The field separator is not considered to
be part of either the field preceding or the field following, so
with 'sort -t " "' the same input line has three fields: an empty
field, 'foo', and 'bar'. However, fields that extend to the end of
the line, as '-k 2', or fields consisting of a range, as '-k 2,3',
retain the field separators present between the endpoints of the
range.
E como Stephane comentou, isso também se aplica vice-versa - você pode classificar apenas uma fatia de um campo com um intervalo de bytes e até mesmo várias fatias do mesmo campo com várias chaves. Portanto, no seu caso, você pode usar o mesmo campo com intervalos diferentes várias vezes. Vêem?
sort -k1.5n -k1.1n --debug <<\DATA
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: key 2 is numeric and spans multiple fields
2FOO1FOO9
_
_
_________
1FOO2FOO3
_
_
_________
4FOO5FOO5
_
_
_________
Isso instrui sort
a ordenar a chave primária começando com o 5º byte no campo 1 e se estendendo até o final do campo 1, e secundariamente para classificar do 1o byte no campo 1 para o campo de um fim. A opção --debug
é muito útil ao tentar classificar sort
, como espero que o acima demonstre. Mas aqui está sem depuração:
sort -k1.5n -k1.1n <<\DATA
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA
###OUTPUT###
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5
Se você quisesse sort
apenas um único caractere para cada um, seria necessário fechar seus intervalos. No exemplo acima, -k1.5n
funciona do byte 5 para o final do campo porque a especificação da chave funciona como:
-k[begin field].[first byte in key],[end field].[last byte in key]
Assim, embora os resultados sejam idênticos para este caso, você pode fechar cada intervalo de campo no mesmo byte com o qual você o abre:
sort -k1.5,1.5n -k1.1,1.1n
e, portanto, apenas sort
por um único byte para cada chave.