separador examples columnas campos unix awk substr

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