Я запускаю команду:

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 join , но поскольку они не упорядочены по-разному, пропускается много записей.

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

3 ответа3

2

Что-то не так с вашим вопросом: вы утверждаете, что используете $'\xE7' в качестве разделителя записей, но этот байт не появляется в файле. Если это действительно команда, которую вы выполняли, и это действительно ваши выходные данные, то файл A был отсортирован по всей строке, а файл B был отсортирован случайным образом (все поля 2 пусты, и sort по умолчанию нестабильна). Тем не менее, поскольку файл 2 выглядит отсортированным во втором « , » -разделенном поле в вашем выводе из файла B, я думаю, что это ошибка в вашем вопросе, и либо ваш код использовал пробел или запятую в качестве разделителя, либо ваши данные содержат байт E7, где ваши данные здесь имеют запятую и пробел.

Если вы передаете опцию -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

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

Существует параметр командной строки для сортировки, который будет сортировать по номерам, это то, что вы хотите (наберите «man sort» на панели Google)

0

Пытаться:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .