133 votes

Obtenir le dernier champ en utilisant awk substr

J'essaie d'utiliser awk pour obtenir le nom d'un fichier à partir du chemin absolu du fichier.
Par exemple, si l'on donne le chemin d'entrée /home/parent/child/filename Je voudrais obtenir filename J'ai essayé :

awk -F "/" '{print $5}' input

qui fonctionne parfaitement.
Cependant, je fais du codage dur $5 ce qui serait incorrect si mon entrée a la structure suivante :

/home/parent/child1/child2/filename

Donc une solution générique nécessite de toujours prendre la dernier (qui sera le nom du fichier).

Existe-t-il un moyen simple de faire cela avec la fonction substr d'awk ?

272voto

fedorqui Points 42938

Utilisez le fait que awk divise les lignes dans les champs en fonction d'un séparateur de champs, que vous pouvez définir. Ainsi, en définissant le séparateur de champs comme / vous pouvez le dire :

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

comme NF se réfère au nombre de champs de l'enregistrement actuel, l'impression $NF signifie imprimer le dernier.

Donc, avec un fichier comme celui-ci :

/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename

Ce serait la sortie :

$ awk -F"/" '{print $NF}' file
filename
filename
filename

37voto

piokuc Points 11938

Dans ce cas, il est préférable d'utiliser basename au lieu de awk :

 $ basename /home/parent/child1/child2/filename
 filename

7voto

Chris Koknat Points 1732

Si vous êtes ouvert à une solution Perl, en voici une similaire à la solution awk de fedorqui :

perl -F/ -lane 'print $F[-1]' input

-F/ spécifie / comme séparateur de champ
$F[-1] est le dernier élément du @F tableau autosplit

5voto

devnull Points 45016

Une autre option consiste à utiliser bash substitution de paramètres .

$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename

3voto

Pierre-Damien Points 135

Cela devrait être un commentaire à la réponse de base mais je n'ai pas assez de point.

Si vous n'utilisez pas de guillemets, basename ne fonctionnera pas avec les chemins où il y a un caractère d'espace :

$ basename /home/foo/bar foo/bar.png
bar

ok avec les guillemets " "

$ basename "/home/foo/bar foo/bar.png"
bar.png

exemple de fichier

$ 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X