O que está acontecendo no seguinte snippet de código? Não estou obtendo minha saída esperada.
Eu acho que foi um bug, mas acontece em 2 programas diferentes (uniq e sort), então eu suspeito que isso tenha algo a ver com ... bem, eu não sei o que ... daí a pergunta.
Os 3 primeiros (de 4) exemplos funcionam, mas o 4º falha !.
Eu esperaria o mesmo comportamento para todos e quaisquer personagens.
ie para imprimir 2 linhas (das 3 linhas de entrada) ... mas no 4º caso, recebo apenas 1 linha (para ambos sort -u
e uniq
); os dois lins idênticos simplesmente desaparecem!
Eu converti a saída '\ n' para o espaço para compactar a vista.
Estou usando o uniq e classifico de (GNU coreutils) 7.4 ... executando no Ubuntu 10.04.3 LTS desktop.
O script:
{
locale -k LC_COLLATE
echo
for c1 in x 〼 ;do
for c2 in z 〇 ;do
echo -n "asis : "; echo -e "$c1\n$c2\n$c2" |tr '\n' ' ';echo
echo -n "uniq : "; echo -e "$c1\n$c2\n$c2" |uniq |tr '\n' ' ';echo
echo -n "sort -u: "; echo -e "$c1\n$c2\n$c2" |sort -u |tr '\n' ' ';echo
echo
done
echo
done
}
A saída:
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2081
collate-codeset="UTF-8"
asis : x z z
uniq : x z
sort -u: x z
asis : x 〇 〇
uniq : x 〇
sort -u: 〇 x
asis : 〼 z z
uniq : 〼 z
sort -u: 〼 z
asis : 〼 〇 〇
uniq : 〼
sort -u: 〼
# In the last example (of 4) where did the '〇' go? .. U+3007 IDEOGRAPHIC NUMBER ZERO
#
sort -u
e uniq
trabalho bem com: LC_COLLATE=C; echo -e "〼\n〇\n〇" |sort -u
(ou |uniq
)
sort
sozinho (sem a opção -u ) ... não devora caracteres. O que entra, sai ... No entanto, como pode ser esperado pela explicação de Gilles dos caracteres unicode "exóticos" que têm o mesmo valor canônico , esses Os caracteres não são classificados, exceto pelo fato de serem emitidos como um grupo FIFO não classificado para o "topo" da saída da classificação ... Portanto, existem realmente dois problemas aqui: 1. Os caracteres não são classificados como podem ser "ingenuamente "esperado e 2. O recurso" exclusivo "de ambossort
euniq
perda de dados (em alguns casos).