2013-12-11 5 views
2
> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s 
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu 
f.dpu 

С "." не является полем разделения символов по умолчанию, первые 3 символы появляются, чтобы сказать:«sort -s» считает, что «p» предшествует «d»?

  • < F = F (это нормально)

  • < г =. (В ASCII, "" < "d", но я в порядке с рода решающими буквами прийти до пунктуации)

  • < р = d (это проблематично)

Еще хуже, если удалить одну букву из второй строки, результаты перепутаны:

> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dp" | sort -s 
f.dp 
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu 

Что безобразие происходит здесь и как я могу остановить это? Я думал, что «-s» хватит, но, видимо, нет.

Из того, что я могу сказать, «sort» думает «f.dpu»> «fdp.t», потому что «u»> «t». Однако это сравнение никогда не должно быть сделано, поскольку персонажи перед ним уже отличаются.

В качестве примечания, я получаю те же результаты без «-s».

EDIT: переменная окружения LC_ALL на «C» исправляет это, но мне все еще кажется, что оставляя пустую строку LC_ALL (locale), дает непоследовательные результаты (разные в порядке, несоответствующий - плохо).

+0

Ну, я эхо прямо с терминала, поэтому думаю, что нет. – barrycarter

+0

Дубликат [сортировка не сортируется, как ожидалось] (http://stackoverflow.com/questions/5909404/sort-not-sorting-as-expected-space-and-locale). Из часто задаваемых вопросов GNU: «[свернутый случай и пунктуация игнорируется] (http://www.gnu.org/software/coreutils/faq/)»; пробелы и пунктуация используются только как тай-брейки. «fdptxtU» предшествует «fdpu». –

+0

@RaymondChen Ты прав. У меня была изменена переменная среды LANG на «en_US.iso88591», которая, очевидно, имеет тот же эффект, что и en_US.UTF-8, упомянутый в FAQ. Я думал, что «-s» остановит эффект «тай-брейка», но, по-видимому, нет. Пожалуйста, напишите свой ответ, и я его одобрю. У этой расстраивающей сортировки нет опции «--ignore-local» (хотя настройка переменной среды LC_ALL на C работает), и файлы, отсортированные на одной машине, не сортируются на другом. – barrycarter

ответ

1

Во-первых, я должен был включить расширенное эхо:

$ shopt -s xpg_echo 

Теперь, я побегу, что вы дали:

BASH 3.2:$ echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s 
f.dpu 
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu 

Это правильный отсортированный Заказывайте . сортируется перед тем d , поэтому f.dpu должен быть первым.

Я не получаю ваши результаты. Это может быть потому, что я нахожусь в Mac OS X, а не в Linux. Тем не менее, опция -s на обоих говорит «стабилизировать сортировку, отключив сравнение последнего курорта». Являются ли они любыми другими параметрами оболочки, которые вы установили, которые могут вызывать эти проблемы?

Вот мои настройки shopt:

$ shopt 
cdable_vars  off 
cdspell   off 
checkhash  off 
checkwinsize on 
cmdhist   on 
compat31  off 
dotglob   off 
execfail  off 
expand_aliases on 
extdebug  off 
extglob   on 
extquote  on 
failglob  off 
force_fignore on 
gnu_errfmt  off 
histappend  off 
histreedit  off 
histverify  off 
hostcomplete on 
huponexit  off 
interactive_comments on 
lithist   on 
login_shell  off 
mailwarn  off 
no_empty_cmd_completion off 
nocaseglob  off 
nocasematch  off 
nullglob  off 
progcomp  on 
promptvars  on 
restricted_shell off 
shift_verbose off 
sourcepath  on 
xpg_echo  on 

три отличия от значения по умолчанию у меня есть exglob, lithist и xpg_echo, которые я просто установить для того, чтобы получить эту работу.

Можете ли вы придумать что-нибудь еще, что может произойти?

Смежные вопросы