Várias opções:
awk '
function basename(file) {
sub(".*/", "", file)
return file
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Ou:
awk '
function basename(file, a, n) {
n = split(file, a, "/")
return a[n]
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Observe que essas implementações de basename
devem funcionar para os casos comuns, mas não nos casos de canto, como basename /path/to/x///
onde eles retornam a cadeia vazia em vez de x
ou /
onde retornam a cadeia vazia em vez de /
, embora para arquivos regulares, isso não deva acontecer.
O primeiro não funcionará corretamente se os caminhos do arquivo (até o último /
) contiverem seqüências de bytes que não formam caracteres válidos no código do idioma atual (normalmente esse tipo de coisa acontece nos códigos de idioma UTF-8 com nomes de arquivos codificados em cerca de 8 conjunto de caracteres de byte único). Você pode contornar isso fixando o código do idioma em C, onde cada sequência de bytes forma caracteres válidos.
n = split(FILENAME, a, "/"); basename=a[n];
. Não use,sub
pois isso realmente mudará aFILENAME
variável (o que não é um problema da função, pois o awk usa a chamada por valor).