Несколько вариантов:
awk '
function basename(file) {
sub(".*/", "", file)
return file
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Или:
awk '
function basename(file, a, n) {
n = split(file, a, "/")
return a[n]
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Обратите внимание, что эти реализации basenameдолжны работать для общих случаев, но не в угловых случаях, например, basename /path/to/x///когда они возвращают пустую строку вместо xили /когда они возвращают пустую строку вместо /, хотя для обычных файлов это не должно происходить.
Первый из них не будет работать должным образом, если пути к файлам (до последнего /) содержат последовательности байтов, которые не образуют допустимых символов в текущей локали (обычно такого рода вещи случаются в локалях UTF-8 с именами файлов, закодированными в некоторых 8 битовый однобайтовый набор символов). Вы можете обойти это, установив локаль на C, где каждая последовательность байтов образует допустимые символы.
n = split(FILENAME, a, "/"); basename=a[n];. Не используйте, такsubкак это на самом деле изменитFILENAMEпеременную (что не является проблемой для функции, так как awk использует вызов по значению).