Кілька варіантів:
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 використовує виклик за значенням).