Varias opciones:
awk '
function basename(file) {
sub(".*/", "", file)
return file
}
{print FILENAME, basename(FILENAME)}' /path/to/file
O:
awk '
function basename(file, a, n) {
n = split(file, a, "/")
return a[n]
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Tenga en cuenta que esas implementaciones basename
deberían funcionar para los casos comunes, pero no en casos de esquina como basename /path/to/x///
donde devuelven la cadena vacía en lugar de x
o /
donde devuelven la cadena vacía en lugar de /
, aunque para los archivos normales, eso no debería suceder.
El primero no funcionará correctamente si las rutas de los archivos (hasta el último /
) contienen secuencias de bytes que no forman caracteres válidos en la configuración regional actual (normalmente, este tipo de cosas suceden en configuraciones regionales UTF-8 con nombres de archivos codificados en algunos 8). bit conjunto de caracteres de un solo byte). Puede solucionarlo fijando la configuración regional en C donde cada secuencia de bytes forma caracteres válidos.
n = split(FILENAME, a, "/"); basename=a[n];
. No lo usesub
ya que eso realmente cambiará laFILENAME
variable (que no es un problema con la función ya que awk usa la llamada por valor).