Хотя это излишне для настоящего примера из-за решение, предложенное в ответе пользователя68186, вы могли бы сделать что-то вроде этого в GNU awk:
глазеть -F/ '
функция mycmp(i1,v1,i2,v2) {
м = разделить (v1, а);
n = разделить (v2, b);
вернуть a[m]"" > b[n]"" ? 1 : а[м]"" < б[н]"" ? -1 : 0
}
{
строки[NR] = $0
}
КОНЕЦ {
PROCINFO["sorted_in"] = "mycmp";
for(i in lines) печатать строки[i]
}
' файл
Обратите внимание, что он сортируется в соответствии с лексическим значением всего после последнего / - так что если формат Автор-<имя автора>-<название>.<расширение> это будет
- фиксированная строка
Автор- (что не имеет никакого эффекта, так как имеет одинаковый вес для всех линий); тогда
<имя автора>-; тогда
<название>.; тогда
<extension>
Это похоже на то, как GNU Сортироватьпростой KEYDEF -т- -к2 работает, то есть эффективный ключ сортировки начинается с <author name> и продолжается до конца строки.
Явный разделитель опущен в расколоть вызовы, чтобы они наследовали значение ФС, что упрощает изменение для систем, использующих другой разделитель пути. Добавленные пустые строки "" в mycmp функция вызывает лексическое сравнение, даже если имена файлов числовые - см., например Как awk выполняет преобразование между строками и числами
Если вы предпочитаете придерживаться Сортировать команду, вы можете использовать GNU awk Двусторонняя связь с другим процессом к:
- продублировать последний
/-разделенное поле в начале строки
- передать результат в
Сортировать команда
- прочитать отсортированный результат, удалить повторяющийся префикс и распечатать
то есть
глазеть -F/ '
НАЧАЛО {ОФС=ФС; cmd = "сортировать -d"}
{print $NF $0 |& cmd}
КОНЕЦ {
близко (команда, "к");
в то время как (cmd |& getline) {$ 1 = ""; Распечатать};
закрыть(cmd,"от")
}
' файл
Здесь есть небольшой обман в том, что абсолютные пути (строки начинаются с /) подразумевают начальное пустое поле; для обработки относительных путей, которые вам нужно изменить напечатать $NF $0 к напечатать $NF,$0 вставить «отсутствующий» разделитель, а затем, возможно, использовать регулярное выражение суб() вместо более простого $1 = "" для удаления ведущего элемента.
А также потенциально быстрее/более эффективно использовать память, чем чистый пялиться решение, это позволяет другим Сортировать опции, которые будут добавлены прямо напр. cmd = "сортировать -d -t "FS" -k1,1r" .