Extraire le nom de fichier du chemin dans le programme awk
21
J'ai un script awk et je lui ai transmis un fichier CSV.
awk -f script.awk /home/abc/imp/asgd.csv
Ce que je fais, c'est de faire entrer FILENAME script.awk. FILENAME me donne tout le chemin. Comme je suis en awk, je ne peux pas l'utiliser basename FILENAME.
print FILENAME;/home/abc/imp/asgd.csv
J'ai essayé avec ça en dedans script.awk
echo $FILENAME | awk -F"/"'{print $NF}'
mais je ne peux pas exécuter cela à l'intérieur script.awk. Comment puis-je accéder asgd.csvà un programme awk?
awk '
function basename(file, a, n){
n = split(file, a,"/")return a[n]}{print FILENAME, basename(FILENAME)}' /path/to/file
Notez que ces implémentations de basenamedevraient fonctionner pour les cas courants, mais pas dans les cas d'angle comme basename /path/to/x///où ils renvoient la chaîne vide à la place xou /où ils renvoient la chaîne vide à la place /, bien que pour les fichiers normaux, cela ne devrait pas se produire.
Le premier ne fonctionnera pas correctement si les chemins de fichier (jusqu'au dernier / ) contiennent des séquences d'octets qui ne forment pas de caractères valides dans les paramètres régionaux actuels (généralement ce genre de chose se produit dans les paramètres régionaux UTF-8 avec des noms de fichiers codés dans 8 jeu de caractères à un seul octet). Vous pouvez contourner cela en fixant les paramètres régionaux à C où chaque séquence d'octets forme des caractères valides.
Si vous avez besoin du code qui fonctionnera facilement dans un script awk existant sans introduire une fonction, vous devez utiliser: n = split(FILENAME, a, "/"); basename=a[n];. Ne pas utiliser subcar cela changera réellement la FILENAMEvariable (ce qui n'est pas un problème avec la fonction car awk utilise l'appel par valeur).
la meilleure façon de l'exporter depuis le CSV d'entrée ou directement depuis le chemin du fichier d'entrée, vous pouvez l'inverser, puis obtenir 1 colonne, puis l'inverser à nouveau.
Sur les systèmes où basename commande est disponible, on pourrait utiliser awkla system()fonction ou la expression | getline varstructure de pour appeler une basenamecommande externe . Cela peut aider à rendre compte des cas d'angle mentionnés dans la réponse de Stéphane .
n = split(FILENAME, a, "/"); basename=a[n];
. Ne pas utilisersub
car cela changera réellement laFILENAME
variable (ce qui n'est pas un problème avec la fonction car awk utilise l'appel par valeur).Essayez ce awk one-liner,
la source
awk 'END{ var=FILENAME; n=split (var,a,/\//); print a[n]}' /home/abc/imp/asgd.csv
la meilleure façon de l'exporter depuis le CSV d'entrée ou directement depuis le chemin du fichier d'entrée, vous pouvez l'inverser, puis obtenir 1 colonne, puis l'inverser à nouveau.
ou simplement
la source
Utilisez la fonction Split d'Awk
Pour ce faire, vous pouvez utiliser la fonction de partage. Par exemple:
Cela fonctionne même sur plusieurs fichiers. Par exemple:
la source
Sur les systèmes où
basename
commande est disponible, on pourrait utiliserawk
lasystem()
fonction ou laexpression | getline var
structure de pour appeler unebasename
commande externe . Cela peut aider à rendre compte des cas d'angle mentionnés dans la réponse de Stéphane .la source