separador de ordenação: chaves e colchetes

2

Estou usando este comando

cat acronyms.tex | sort -t{ -k1

para ordenar um arquivo no qual o formato das strings é assim

\newacronym{ex}{EX}{Expanded}

Eu quero classificar pelo conteúdo do primeiro par de chaves. No entanto, algumas linhas são assim

\newacronym[a string]{ex2}{EX2}

O comando que estou usando não é capaz de distinguir entre { e [ , e o resultado é que a segunda sequência é classificada antes da primeira.

Como posso distinguir [ e { ?

    
por Mychele 07.09.2017 / 09:39

2 respostas

1

Se houver algum motivo para você precisar classificar apenas o conteúdo do primeiro par de chaves, a maneira mais simples provavelmente é com um decorar-classificar-undecorate padrão . Eu vou usar sed e cut , mas há muitas opções para fazer isso funcionar no shell:

sed -e 's/^\([^{]*{\([^}]*\)}\)/ /' < data|sort|cut -d' ' -f2-

O comando sed substitui tudo até o fim de o primeiro par de chaves com o conteúdo das chaves, um espaço e, em seguida, a seqüência original. Isso pode ser classificado como de costume. Eu estou então cut do campo que eu adicionei no início novamente.

Isto irá lidar com caracteres ímpares na chave razoavelmente bem, e comprimentos desiguais, embora os espaços sejam um problema, e escape \} seria também. Um separador diferente pode ser usado, se necessário.

Se os dados forem:

\newacronym{A}{EX}{Expanded}
\newacronym{F}{EX}{Expanded}
\newacronym{D}{EX}{Expanded}
\newacronym{C}{EX}{Expanded}
\newacronym[abc]{B}{EX}{Expanded}
\newacronym{CD}{EX}{Expanded}
\newacronym[def]{E}{EX}{Expanded}

o comando sed resulta em:

A \newacronym{A}{EX}{Expanded}
F \newacronym{F}{EX}{Expanded}
D \newacronym{D}{EX}{Expanded}
C \newacronym{C}{EX}{Expanded}
B \newacronym[abc]{B}{EX}{Expanded}
CD \newacronym{CD}{EX}{Expanded}
E \newacronym[def]{E}{EX}{Expanded}

e o resto é simples.

    
por 07.09.2017 / 09:59
1

Usar -k1 fará com que sort use a linha inteira como a chave de classificação. Não é isso que você quer.

Suponho que você gostaria de usar ex e ex2 (conforme encontrado em {...} ) como a chave. Para fazer isso, especifique -k2 como o campo de classificação.

Isso vai pegar tudo depois do primeiro { e usar isso como chave.

\newacronym{ex}{EX}{Expanded}
^^^^^^^^^^^ ^^^ ^^^ ^^^^^^^^^
field 1     f2  f3  field 4

\newacronym[a string]{ex2}{EX2}
^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^^^
field 1               f2   f3

Para somente usar o segundo campo como a chave (não o resto da linha), use -k2,2 .

Teste:

$ sort -t '{' -k2,2 file
\newacronym[a string]{ex2}{EX2}
\newacronym{ex}{EX}{Expanded}

A linha ainda sai na ordem errada. Isso ocorre porque ex2} classifica antes de ex} ( } vem depois de 2 na tabela ASCII e estou usando o código do idioma POSIX).

Tentando novamente, mas desta vez no Ubuntu com o en_US.UTF-8 locale (deve funcionar em qualquer Linux da glibc e na maioria dos locais, exceto o C ou POSIX locales):

$ LC_COLLATE="en_US.UTF-8" sort -t '{' -k2,2 file
\newacronym{ex}{EX}{Expanded}
\newacronym[a string]{ex2}{EX2}

Dependendo das configurações de localidade, você pode ou não ter que adicionar o LC_COLLATE=... bit.

Observe que sort é um utilitário separado do bash shell e funciona da mesma maneira, independentemente do shell. Portanto, esta não é uma questão " bash sort", apenas uma questão sort .

    
por 07.09.2017 / 09:47