Eu tenho um arquivo muito grande que desejo classificar em ordem alfabética. É um arquivo separado por tabulações, mas eu realmente preciso ter certeza de que o arquivo está classificado começando pelo primeiro caractere da linha, independentemente de ser espaço ou qualquer outra coisa.
Exemplo do arquivo de entrada:
2090802 V19 I must be the third in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V17 I must be the second in the group
2090802 V16 I must be the first in the group of 2090802
Com o comando sort test.txt > test-s.txt
obtenho esta saída:
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V19 I must be the third in the group
Parece que o programa de classificação vê a primeira coluna com o mesmo valor (ignorando o espaço na linha 3) e classifica o arquivo usando a próxima (V16, V17, V18 e V19).
Porém, quero que o valor 20908 02
seja considerado distinto e meu resultado esperado deve ser este:
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
2090802 V19 I must be the third in the group
Tentei com o -b
argumento, e também -t
dar outro separador, mas ainda não obtive o resultado desejado.
Como posso classificar o arquivo considerando cada caractere da linha, sem ignorar os espaços em branco?
A ordem de classificação depende da localidade. Na maioria das localidades, o espaçamento é ignorado na primeira aproximação (veja como o espaço (U+0020) e TAB (U+0009) têm
IGNORE
os 3 primeiros pesos em ISO14651 ).Se você deseja uma ordem de classificação em que cada caractere (na verdade byte) conte e a ordem seja baseada no valor do byte (para texto codificado em UTF-8, que coincide com a classificação baseada no valor do ponto de código Unicode), use o
C
também conhecido comoPOSIX
localidade:A configuração
LC_ALL
afeta todas as categorias de localização. A ordem de classificação é afetada pelaLC_COLLATE
categoria, mas aqui, a configuraçãoLC_CTYPE
(que afeta como os caracteres e as sequências de bytes são codificados/decodificados de/para) éC
provavelmente uma boa ideia, pois garante que qualquer sequência de bytes possa ser decodificada em caracteres e classificada (por byte valor).LC_COLLATE=C sort your-file
também não funcionaria seLC_ALL
também fosse definido de outra forma.Embora o uso
LC_ALL=C
provavelmente seja mais rápido e eficiente, outra opção é usar-k
para ordenarsort
apenas no primeiro campo e nada mais*:* Na verdade,
sort
(ou, pelo menos, GNUsort
) ainda procurará no resto da linha sua classificação de "último recurso" quando encontrar dois campos de classificação idênticos. Isso é explicado eminfo sort
um sistema GNU:É essa classificação de último recurso que faz com que a linha V16 apareça antes da linha V17 na saída, apesar de estar na ordem inversa na entrada.