Хотя это излишне для настоящего примера из-за решение, предложенное в ответе пользователя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"
.