AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 477998
Accepted
Draconis
Draconis
Asked: 2018-10-27 08:32:47 +0800 CST2018-10-27 08:32:47 +0800 CST 2018-10-27 08:32:47 +0800 CST

Por que sort diz que ɛ = e?

  • 772

ɛ("Latin epsilon") é uma letra usada em certas línguas africanas, geralmente para representar o som da vogal em inglês "bed". Em Unicode é codificado como U+025B, muito diferente do e.

No entanto, se eu sorto seguinte:

eb
ed
ɛa
ɛc

parece que sortconsidera ɛe eequivalente:

ɛa
eb
ɛc
ed

O que está acontecendo aqui? E existe uma maneira de fazer ɛe edistinguir para sortfins de ing?

sort locale
  • 3 3 respostas
  • 4410 Views

3 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-10-27T11:38:35+08:002018-10-27T11:38:35+08:00

    Não, não os considera equivalentes, apenas têm o mesmo peso primário. Então, em primeira aproximação, eles classificam o mesmo.

    Se você olhar para /usr/share/i18n/locales/iso14651_t1_common (como usado como base para a maioria das localidades) em um sistema GNU (aqui com glibc 2.27), você verá:

    <U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
    <U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
    <U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
    

    e, ɛe Etêm o mesmo peso primário, ee Emesmo peso secundário, apenas o terceiro peso os diferencia.

    Ao comparar strings, sort(a strcoll()função libc padrão é usada para comparar strings) começa comparando os pesos primários de todos os caracteres, e só vai para o segundo peso se as strings forem iguais aos pesos primários (e assim por diante com os outros pesos) .

    É assim que o caso parece ser ignorado na ordem de classificação em primeira aproximação. Abclassifica entre aae ac, mas Abpode classificar antes ou depois abdependendo da regra do idioma (alguns idiomas têm <MIN>antes <CAP>como em inglês britânico, alguns <CAP>antes <MIN>como em estoniano).

    Se etivesse a mesma ordem de classificação que ɛ, printf '%s\n' e ɛ | sort -uretornaria apenas uma linha. Mas como <BAS>classifica antes <PCL>, esó classifica antes ɛ . eɛeclassifica depois EEE(no peso secundário) mesmo que EEEclassifica depois eee(para o qual precisamos ir até o terceiro peso).

    Agora, se no meu sistema com glibc 2.27, eu corro:

    sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
      sort -k2 | uniq -Df1
    

    Você notará que existem alguns caracteres que foram definidos com exatamente os mesmos 4 pesos. Em particular, nosso ɛ tem os mesmos pesos que:

    <U01DD> <e>;<PCL>;<MIN>;IGNORE
    <U0259> <e>;<PCL>;<MIN>;IGNORE
    <U025B> <e>;<PCL>;<MIN>;IGNORE
    

    E com certeza:

    $ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
    ǝ
    $ expr ɛ = ǝ
    1
    

    Isso pode ser visto como um bug de localidades GNU libc. Na maioria dos outros sistemas, as localidades garantem que todos os caracteres diferentes tenham uma ordem de classificação diferente no final. Em localidades GNU, fica ainda pior, pois existem milhares de caracteres que não têm uma ordem de classificação e acabam classificando da mesma forma, causando todos os tipos de problemas (como quebrar comm, join, lsou globs com ordens não determinísticas ... ), daí a recomendação de usar LC_ALL=Cpara contornar esses problemas .

    Conforme observado por @ninjalj nos comentários, o glibc 2.28 lançado em agosto de 2018 veio com algumas melhorias nessa frente, embora o AFAICS, ainda existam alguns caracteres ou elementos de agrupamento definidos com ordem de classificação idêntica. No Ubuntu 18.10 com glibc 2.28 e em uma localidade en_GB.UTF-8.

    $ expr $'L\ub7' = $'L\u387'
    1
    

    (por que U+00B7 seria considerado equivalente a U+0387 somente quando combinado com L/ l?!).

    E:

    $ perl -lC -e 'for($i=0; $i<0x110000; $i++) {$i = 0xe000 if $i == 0xd800; print chr($i)}' | sort > all-chars-sorted
    $ uniq -d all-chars-sorted | wc -l
    4
    $ uniq -D all-chars-sorted | wc -l
    1061355
    

    (ainda mais de 1 milhão de caracteres (95% do intervalo Unicode, abaixo de 98% em 2.27) classificando da mesma forma que outros caracteres, pois sua ordem de classificação não está definida).

    Veja também:

    • O que "LC_ALL=C" faz?
    • Gerar a ordem de agrupamento de uma string
    • Qual é a diferença entre "sort -u" e "sort | uniq"?
    • 68
  2. Ipor Sircer
    2018-10-27T08:35:19+08:002018-10-27T08:35:19+08:00

    homem tipo:

       ***  WARNING  ***  The locale specified by the environment affects sort
       order.  Set LC_ALL=C to get the traditional sort order that uses native
       byte values.
    

    Então tente:LC_ALL=C sort file.txt

    • 15
  3. jimmij
    2018-10-27T09:34:27+08:002018-10-27T09:34:27+08:00

    O caractere ɛ não é igual a e, mas alguns locais podem reunir esses sinais juntos após a ordenação. A razão para isso é específica da linguagem, mas também de algum contexto histórico ou mesmo político. Por exemplo, a maioria das pessoas provavelmente espera que a moeda €uro chegue perto da Europa no dicionário.

    De qualquer forma, para ver qual agrupamento você está usando no momento, run locale, o locale -afornecerá a lista de localidades disponíveis no sistema e, para alterar o agrupamento, digamos Capenas para uma execução de classificação LC_COLLATE=C sort file. Finalmente, para ver como diferentes localidades podem classificar seu arquivo, tente

    for loc in $(locale -a)
        do echo ____"${loc}"____
        LC_COLLATE="$loc" sort file
    done
    

    Encaminhe o resultado para alguma ferramenta greping para escolher a localidade que atenda às suas necessidades.

    • 8

relate perguntas

  • A classificação numérica falha ao classificar corretamente o arquivo

  • Arch Linux: Falha ao definir a localidade. Corrija seu sistema

  • Como classificar o número de linhas por data em um arquivo?

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Leia o arquivo de texto com palavras e sua contagem de ocorrências e saída de impressão classificada

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve