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

3349
Carl Norum

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

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) 

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

2

1 ответ на вопрос

4
Carl Norum

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

git blame file | sort -b -k 3 
Вы также должны следить за именами авторов, которые содержат разное количество пробелов. Во всех ваших примерах есть имена авторов, состоящие из одного слова (`eeeeeee`,` cccccccc` и `hhhhhhhh`), но реальные имена часто будут разными (например, git.git содержит имена авторов, разделенные пробелом от одного до пяти)« слова»). Использование `-e` может помочь; адреса электронной почты, которые он показывает, с меньшей вероятностью будут иметь пробелы. Chris Johnsen 13 лет назад 2
@Chris - good point. This was just a one-off that confused me, so I'm not worried about it in general, but that's good to remember if I were to script this up. Carl Norum 13 лет назад 0