utilisation de awk pour extraire et split
je suis en train d'extraire une sous-chaîne avec awk partir d'une invite de réponse dans bash
exemple de sortie ligne: abc_def_ghi jkl_lmn_opq
l'obtention de la deuxième partie est facile par
echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'
mais j'ai seulement besoin de la dernière partie de sous-chaîne "ordre" et de ne pas trouver un moyen de laisser awk exécuter deux fois au cours de la chaîne, lorsque je passe le résultat à partir de ci-dessus à une variable et utiliser cette variable pour la deuxième awk j'obtiens une erreur, car la chaîne est un chemin d'accès et donc d'un Répertoire. aussi je n'ai pas eu sed à travailler avec le même message d'erreur lorsqu'il est utilisé sur un stockées var avec la chaîne et je n'ai pas réussi à passer la première sous-chaîne à la deuxième awk ou sed. bizarre?
ce serait faire le Travail si pas premier awk affichera au lieu de passer à la deuxième awk
echo abc_def_ghi jkl_lmn_opq | awk '{print $2}' | awk -F"_" '{print $3}'
œuvres ni
echo abc_def_ghi jkl_lmn_opq | awk '{$2}' | awk -F"_" '{print $3}'
comment puis je le passe droit pour ensuite la bande?
OriginalL'auteur peet | 2013-06-05
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner:
NF
est un construit-dans la variable qui stocke le nombre de champs. Lorsque vous divisez la ligne avec_
et direawk
pour imprimer$NF
vous permettra d'imprimer le dernier champ.Cependant, vous pourriez ne pas toujours besoin de la dernière partie de la chaîne. Dans ce cas, vous pouvez utiliser
substr
fonction dansawk
.En utilisant le même exemple, vous pouvez faire:
substr
fonction prend 3 arguments, le troisième étant en option. Le premier argument est la chaîne en question. Deuxième argument est le point de départ et le troisième argument (optionnel) est la longueur que vous souhaitez capturer. Si vous ne fournissez pas de il alors, par défaut, il s'agira de saisir le tout jusqu'à la fin de la chaîne.merci encore pour les vinyls dans les plus profonds et de fournir comprimé guide d'utilisation, j'aime la substr version, alors que dans ce cas spécial, je ne suis pas toujours shure de la (parce que la chaîne renvoyée par une autre fonction) longueur de la chaîne, alors que je suis shure, elle sera toujours la dernière partie
Vous êtes les bienvenus.
pour les autres maintenant avoir besoin de la deuxième (ou d'autres) dernière sous-chaîne dans cette solution serait:
echo abc_def_ghi jkl_lmn_opq | awk -F_ '{print $(NF-1)}'
alors que je ne sais pas maintenant comment Compter du début de la chaîne?Vous pouvez toujours utiliser
for loop
et nefor (i=1;i<NF;i++) { printf $i FS } print NF
OriginalL'auteur jaypal singh
Vous pouvez également faire de paramètre de substitution dans bash:
retourne
echo ... | awk ...
est inutile.l'écho a été seulement à la sortie de test, si var est déjà ensemble, c'est une solution très simple, dans mon cas précis, l'entrée de awk est le retour d'une autre fonction et à l'aide d'un var était seulement ma solution de contournement parce qu'il a passé le premier dépouillé de la chaîne de deuxième awk - mais pour les var est une façon cool oui. (alors que je devrai [et est] lire au sujet de cette solution à comprendre 🙂
OriginalL'auteur devnull
OriginalL'auteur Sidharth C. Nadhan
Cela pourrait fonctionner pour vous (GNU sed):
signifie trouver de zéro ou plus de n'importe quel caractère unique. Comme le moteur de regexp est gourmand il zips à la fin de la chaîne. Il a alors à revenir en arrière jusqu'à ce qu'il trouve un
_
. Donc, ce trouve la dernière_
dans la chaîne, puis supprime tous les caractères et le dernier_
laissant le résultat souhaité. Rappelez-vous que la chaîne est tout deabc
àopq
.merci pour l'explication, que serais-je utiliser pour obtenir le deuxième de la dernière sous-chaîne?
OriginalL'auteur potong