GNU сортировать и обвинять

2

Сегодня я думал, что делаю простую операцию:

git blame file | sort -k 3

Чтобы получить все строки fileотсортированы по дате их последнего изменения. К сожалению, это, кажется, не сортирует это правильно. Это действительно работает , если я делаю следующее:

git blame file | cut -c 20- | sort

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

Вот пример строки из вывода git blame file:

35d8e9eb (username 2007-01-17 03:58:04 +0000 155) Some text on line 155

Изменить: Использование любого разумного числа, кроме того, 3в исходной командной строке, кажется, работает нормально - я могу сортировать по хешу (поле 1), имени пользователя (поле 2), времени суток (поле 4) или номеру строки (поле 6), но дата (поле 3) не работает - я не могу определить, в каком порядке она на самом деле заканчивается ...

Редактировать 2: я сделал обеззараженный входной файл, который показывает ту же проблему. Вот cleaned.txt:

cb7bb041 (eeeeeee  2010-12-14 19:41:18 +0000  42)
35d8e9eb (cccccccc 2007-01-17 03:58:04 +0000 135)
d7377fa9 (hhhhhhhh 2010-01-30 04:26:28 +0000 178)

И выход из sort -k 3 cleaned.txt:

$ sort -k 3 cleaned.txt 
cb7bb041 (eeeeeee  2010-12-14 19:41:18 +0000  42)
35d8e9eb (cccccccc 2007-01-17 03:58:04 +0000 135)
d7377fa9 (hhhhhhhh 2010-01-30 04:26:28 +0000 178)

Как вы можете видеть, сортировка по полю даты вообще не состоялась. Вот вывод из cut -c 20- cleaned.txt | sort:

$ cut -c 20- cleaned.txt | sort
2007-01-17 03:58:04 +0000 135)
2010-01-30 04:26:28 +0000 178)
2010-12-14 19:41:18 +0000  42)

Сортировка по датам в таком случае работает отлично! Какие-либо предложения?

Карл Норум
источник

Ответы:

4

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

git blame file | sort -b -k 3
Карл Норум
источник
2
Вы также должны следить за именами авторов, которые содержат разное количество пробелов. Во всех ваших примерах есть имена авторов eeeeeee, состоящие из одного слова (,, ccccccccи hhhhhhhh), но настоящие имена часто могут отличаться (например, git.git содержит имена авторов, содержащие от одного до пяти разделенных пробелами слов). Использование -eможет помочь; адреса электронной почты, которые он показывает, с меньшей вероятностью будут иметь пробелы.
Крис Джонсен
@ Крис - хорошая мысль. Это было единственное, что смутило меня, так что я не беспокоюсь об этом в целом, но это хорошо помнить, если бы я должен был написать это.
Карл Норум