unix - examples - awk substring
Obtener el último campo usando awk substr (7)
En este caso, es mejor usar basename
lugar de awk
:
$ basename /home/parent/child1/child2/filename
filename
Tengo un requisito simple de la siguiente manera
Estoy obteniendo los nombres de los archivos con el directorio absoluto.
Por ejemplo /home/parent/child/filename
Mi requisito es cortar el nombre de archivo de esto.
Lo que he intentado es:
awk -F "/" ''{print $5}'' input
que funciona a la perfección
Pero aquí tengo una codificación difícil de $5
que puede diferir si mi entrada tiene la estructura de la siguiente manera:
/home/parent/child1/child2/filename
Por lo tanto, debe ser dinámico sin codificación dura. Aquí está la lógica:
Siempre tome el último campo que será el nombre del archivo (por lo tanto, debe verificar desde el reverso).
¿Alguien puede ayudarme con la función awk substr o cualquier otra función?
Otra opción es usar la sustitución del parámetro bash
.
$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename
Sé que tengo 3 años de retraso en esto, pero ... debería considerar la expansión de parámetros, está integrado y es más rápido.
si su entrada está en una var, digamos, $ var1, simplemente haga ${var1##*/}
. Mira abajo
$ var1=''/home/parent/child1/filename''
$ echo ${var1##*/}
filename
$ var1=''/home/parent/child1/child2/filename''
$ echo ${var1##*/}
filename
$ var1=''/home/parent/child1/child2/child3/filename''
$ echo ${var1##*/}
filename
Si está abierto a una solución Perl, aquí una similar a la solución awk de Fedorqui:
perl -F/ -lane ''print $F[-1]'' input
-F/
especifica /
como el separador de campo
$F[-1]
es el último elemento de la matriz @F
autosplit
También puedes usar:
sed -n ''s/.*///([^//]/{1,/}/)$//1/p''
o
sed -n ''s/.*///([^//]*/)$//1/p''
Use el hecho de que awk
divide las líneas en campos basados en un separador de campo, que puede definir. Por lo tanto, al definir el separador de campo en /
puede decir:
awk -F "/" ''{print $NF}'' input
como NF
refiere al número de campos del registro actual, imprimir $NF
significa imprimir el último.
Entonces, dado un archivo como este:
/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename
Este sería el resultado:
$ awk -F"/" ''{print $NF}'' file
filename
filename
filename
Debería ser un comentario a la respuesta del juego básico pero no tengo suficiente sentido.
Si no utiliza comillas dobles, el basename
no funcionará con la ruta donde hay espacio de caracteres:
$ basename /home/foo/bar foo/bar.png
bar
ok con comillas ""
$ basename "/home/foo/bar foo/bar.png"
bar.png
ejemplo de archivo
$ cat a
/home/parent/child 1/child 2/child 3/filename1
/home/parent/child 1/child2/filename2
/home/parent/child1/filename3
$ while read b ; do basename "$b" ; done < a
filename1
filename2
filename3