GNU сортування та git звинувачення


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може допомогти; Адреси електронної пошти, які він відображає, набагато рідше містять пробіли.
Кріс Джонсен

@Chris - хороший момент. Це було просто разове, що мене бентежило, тому я взагалі про це не переживаю, але це добре пам’ятати, якби я був це сценарій.
Карл Норум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.