Awk: imprime la última columna o una antes de la última si la última está vacía

Quiero usar AWK para obtener el nombre de archivo o el nombre de la última carpeta si la cadena es solo un directorio.

Tengo:

 awk -F "/" "{print $NF}" 

para imprimir la última columna y:

 awk -F "/" "{print $(NF - 1)} 

para imprimir una columna antes de la última.

¿Cómo puedo hacer awk reconocer si la cadena contiene solo un directorio y ningún nombre de archivo y en este caso imprimir una columna antes de la última.

Mi problema es que un directorio puede verse así:

./folder1/folder2/folder3/ 

y en este caso la última columna estaría vacía. Quiero que awk reconozca esto y luego imprima folder3 (una columna antes de la última).

Respuesta

Puede usar if o el operador ?: para esto.

awk -F "/" "{print $NF == "" ? $(NF - 1) : $NF}" 
awk -F "/" "{if($NF == "") print $(NF - 1); else print $NF}" 

Comentarios

  • El operando ternario test ? true : false es una elección inteligente.

Respuesta

Con las utilidades GNU, vea también:

xargs -rd "\n" basename -a -- 

Que en una list.txt entrada como:

./folder1/folder2/folder3/ ./foo bar/// / 

da:

folder3 foo bar / 

zsh «s :t modificador (de csh) da "" para "/" en lugar de "/"

$ printf "<%s>\n" "${(@)${(f)$(<list.txt)}:t}" <folder3> <foo> <bar> <> 

Responder

prueba

(aunque no pude probarlo).

Responder

En el shell:

$ basename ./folder1/folder2/folder3/ folder3 

Asignar a una variable, usando basename con una variable que contiene un nombre de ruta:

filename=$( basename "$pathname" ) 

La utilidad basename es un estándar Utilidad POSIX .

Comentarios

  • gracias, mi pregunta ha ido ganando un poco más en el uso de AWK, usar basename es mucho más simple.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *