Я пытаюсь отсортировать некоторые простые данные, разделенные каналом. Однако сортировка на самом деле не сортировка. Он перемещает строку заголовка вниз, но две строки, начинающиеся с 241, разделяются на строку, начинающуюся с 24.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Заголовки столбцов перемещаются в конец файла, поэтому сортировка четко их обрабатывает. Но фактические значения сортируются не так, как я ожидал.
В этом случае я работал с этим
sort sort_fail.csv --field-separator='|' -k1,1
Но я чувствую, что в этом не должно быть необходимости. Почему сортировка не сортировка?
LC_COLLATE=C sort
. В зависимости от того, что вы ожидаете, вам также может понадобитьсяLC_COLLATE=C sort -t'|' -n
csvsort
сcsvkit
, который правильно обрабатывает кавычки значения.Ответы:
sort
зависит от локали, поэтому в зависимости от настройки LC_COLLATE (которая унаследована от LANG) вы можете получить разные результаты:Это может вызвать проблемы в сценариях, потому что вы можете не знать, на что настроен вызывающий языковой стандарт, и поэтому можете получить разные результаты.
Сценарии нередко заставляют необходимые настройки
например
Теперь, что интересно,
|
персонаж выглядит странно.Но это потому, что правило по умолчанию для en_US, которое происходит от ISO, говорит
Это означает, что
|
символ игнорируется, и порядок сортировки будет таким, как если бы символ не существовал.И это соответствует "неожиданной" сортировке, которую вы видите.
Обходной путь - использовать
-n
(для принудительной сортировки чисел) или использовать разделитель полей (как вы это сделали) или использоватьC
локаль.источник
--debug
опция, которая указывает ключ (подчеркнутый), используемый для сравненияsort
использует всю строку вместо того, чтобы останавливаться на символах, которые мы предполагаем.Что меня раздражает, так это то, что
24
они не сдвигаются с места между ними241
. Второе поле начинается с1
. При попытке сортировки с ведущим4
во втором поле, поле24
перемещается вниз, поэтому я подозреваю,sort
что просто игнорирует,|
если не указано иное. Попробуйsort -n
...источник
-n, --numeric-sort сравнить по числовому значению строки
Без -n, 210 по тексту опережает 23 по характеру моего персонажа.
источник