Несколько вариантов:
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 использует вызов по значению).