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 basenamedeberí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 xo /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.
Si necesita código que va a funcionar fácilmente dentro de un script awk existentes sin introducir una función, se debe utilizar: n = split(FILENAME, a, "/"); basename=a[n];. No lo use subya que eso realmente cambiará la FILENAMEvariable (que no es un problema con la función ya que awk usa la llamada por valor).
la mejor manera de exportarlo desde el CSV de entrada o directamente desde la ruta del archivo de entrada puede invertirlo, luego obtener 1 columna y luego volverlo a invertir.
En los sistemas donde el basenamecomando está disponible, uno podría usar awkla system()función o expression | getline varestructura para llamar a un basenamecomando externo . Esto puede ayudar a tener en cuenta los casos de esquina mencionados en la respuesta de Stephane .
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).Prueba este awk one-liner,
fuente
awk 'END{ var=FILENAME; n=split (var,a,/\//); print a[n]}' /home/abc/imp/asgd.csv
la mejor manera de exportarlo desde el CSV de entrada o directamente desde la ruta del archivo de entrada puede invertirlo, luego obtener 1 columna y luego volverlo a invertir.
o simplemente
fuente
Utilice la función dividida de Awk
Una forma de hacerlo es usar la función de división. Por ejemplo:
Esto incluso funciona en múltiples archivos. Por ejemplo:
fuente
En los sistemas donde el
basename
comando está disponible, uno podría usarawk
lasystem()
función oexpression | getline var
estructura para llamar a unbasename
comando externo . Esto puede ayudar a tener en cuenta los casos de esquina mencionados en la respuesta de Stephane .fuente