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