Сортировка не является последовательным использованием команды Unix 'вид'

Я выполняю команду:

zcat [File] | sed "1d" | sort -t $'\xE7' -k [field to be sorted] > [file].sorted

Когда я выполняю это на Файле A, сортирующем на поле 1, я получаю следующий результат:

11622400 , abe, def
11622401 , abe, def
11622402 , bbabe, def
11622403 , ddabe, def
11622404 , acdc, dere
11622405 , ddabe, bere
11622406 , abe, fgh
11622407 , adbed, ddee
11622408 , adbe, def
11622409 , abdde, def
1162240 , abe, deed
11622410, def,dede

Но когда я выполняю ту же команду на сортировке файла 2 на поле 2, я получаю это:

1162303, 116224
1162420, 1162240
11623062, 11622400
11623063, 11622401
11623064, 11622402
11623065, 11622403
11623066, 11622404
11623067, 11622405
11623068, 11622406
11623069, 11622407
11623070, 11622408
11623071, 11622409
1162421, 1162241
11623072, 1162410

Почему это не сортирует таким же образом? Первые взгляды в качестве примера неправильно, вторая строка от нижней части должна быть наверху.

Я пытаюсь присоединиться к этим файлам с командой соединения Unix, но потому что они не заказывают таким же образом, это пропускает много записей.

Какова причина этой проблемы?

0
задан 14.11.2012, 20:42

3 ответа

Причина Вы получаете эти результаты, состоит в том, что Ваш вид не является числовым, это основано на канонических значениях столбцов.

Существует переключатель командной строки для сортировки, который отсортирует численно, это - то, что Вы хотите (тип 'вид человека' в Вашей панели Google)

2
ответ дан 24.11.2019, 03:38

Существует что-то не так с Вашим вопросом: Вы утверждаете, что использовали $'\xE7' как разделитель записей, но тот байт не появляется в файле. Если это - действительно команда, Вы работали, и это действительно Ваши выводы, то файл A был отсортирован на основе целой строки, и файл B был отсортирован случайным образом (все поля 2 пусты, и sort не стабильно по умолчанию). Однако, так как файл 2 действительно выглядит отсортированным на втором “, ” - разделенное поле в Вашем выводе из файла B, я предполагаю, что это - ошибка в Вашем вопросе, и или Ваш код использовал пространство или запятую как разделитель, или Ваши данные содержат байт E7, где Ваши данные здесь имеют запятую и пространство.

Если Вы действительно передаете a -t опция установить разделитель для вида, необходимо передать тот же разделитель join. В любом случае необходимо сказать join к каким столбцам присоединиться. Например:

<a.input sort -t $'\xE7' -k1 >a.sorted
<b.input sort -t $'\xE7' -k2 >b.sorted
join -1 1 -2 2 -t $'\xE7' a.sorted b.sorted >joined

Кроме того, учитывая, что “11622409 ,” появляется прежде”1162240 , ” ​ в Вашем выводе из файла A, это появляется, то, что Вы работаете sort в локали, которая приводит к результатам приближающиеся человеческие правила сортировки (только приближение, потому что sort не усовершенствован достаточно для соответствия довольно сложным правилам, используемым в серьезной типографии). Вы получите менее неожиданные результаты при изменении локали на ту, которая приводит к результатам, подходящим для компьютерного потребления. На практике это означает Ваш LC_COLLATE установка должна быть C (или его синоним POSIX). (Любая другая локаль имеет тенденцию повреждать сценарии то использование sort, хотя Ваш должен на самом деле быть в порядке.) Пример:

$ cat a
11622409 , abdde, def
1162241 , abe, deed
11622410, def,dede
$ LC_COLLATE=en_US sort <a
11622409 , abdde, def
11622410, def,dede
1162241 , abe, deed
$ LC_COLLATE=C sort <a
11622409 , abdde, def
1162241 , abe, deed
11622410, def,dede

Если Вы работаете join в той же локали как sort, необходимо быть в порядке. Отметьте это sort производит лексически отсортированный вывод, не численно отсортированный; но к именно это Вы хотите как вход join.

2
ответ дан 24.11.2019, 03:38

Попытка:

zcat [File] | sed "1d" | sort -tn $'\xE7' -k [field to be sorted] > [file].sorted
0
ответ дан 24.11.2019, 03:38

Теги

Похожие вопросы