Comment diviser la chaîne lorsqu'elle contient des symboles de tuyau |
. Je veux les diviser pour être en tableau.
j'ai essayé
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Ce qui fonctionne bien. Si ma chaîne est comme, "12|23|11"
comment puis-je les diviser en un tableau?
OFS
, placez des virgules entre eux, pour lesprint
voir comme des arguments séparés.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) supprime tout jusqu'au (et y compris) le dernier ":", en ne gardant que le "11" ... cela fonctionne pour obtenir le dernier nombre, mais aurait besoin d'être modifié (d'une manière difficile à lire) pour obtenir le 2ème numéro, etc. awk (et le split de awk) est beaucoup plus élégant et lisible.cut
Réponses:
As-tu essayé:
la source
split
est une expression régulière, et|
est un symbole spécial, qui doit être échappé. Utilisationsplit($0, a, "\|")
|
est vu comme un caractère et non comme un symbole spécial est de le mettre entre[]
: c'est-à-diresplit($0, a, "[|]")
# j'aime mieux cela que '\ |', dans certains cas, en particulier comme une variante de l'expression rationnelle ( perl vs grep vs .. autres?) peut avoir "|" interprété littéralement et "\ |" vu comme séparateur de regex, au lieu de l'inverse ... ymmvPour diviser une chaîne en un tableau,
awk
nous utilisons la fonctionsplit()
:Si aucun séparateur n'est donné, il utilise le
FS
, qui par défaut est l'espace:On peut donner un séparateur, par exemple
:
:Ce qui équivaut à le définir via
FS
:Dans gawk, vous pouvez également fournir le séparateur en tant qu'expression régulière:
Et même voir quel était le délimiteur à chaque étape en utilisant son quatrième paramètre:
Citons la page de manuel de GNU awk :
la source
Soyez plus précis! Qu'entendez-vous par «ça ne marche pas»? Publiez la sortie exacte (ou le message d'erreur), votre système d'exploitation et la version awk:
Ou, en utilisant Split:
Edit: sous Solaris, vous devrez utiliser le awk POSIX ( / usr / xpg4 / bin / awk ) afin de traiter correctement 4000 champs.
la source
for(i = 0
oufor(i = 1
?for (i = 1; i <= n; ++i)
...Je n'aime pas la
echo "..." | awk ...
solution car elle appelle des appels inutilesfork
etexec
système.Je préfère une solution Dimitre avec une petite touche
Ou une version un peu plus courte:
Dans ce cas, l'enregistrement de sortie est assemblé, ce qui est une condition vraie, il est donc imprimé.
Dans ce cas précis, la
stdin
redirection peut être épargnée en définissant unawk variable interne:j'ai utilisé ksh pas mal de temps, mais dans frappercela pourrait être géré par une manipulation de chaîne interne. Dans le premier cas, la chaîne d'origine est divisée par un terminateur interne. Dans le second cas, on suppose que la chaîne contient toujours des paires de chiffres séparées par un séparateur à un caractère.
Le résultat dans tous les cas est
la source
bash
expression ...Dispose en
awk
fait d'une fonction appelée lien «Variable de séparation de champ d'entrée» . Voici comment l'utiliser. Ce n'est pas vraiment un tableau, mais il utilise les variables internes $. Pour diviser une simple chaîne, c'est plus facile.la source
devrait marcher.
la source
la source
Blague? :)
Que diriez-vous
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Voici ma sortie:
donc je suppose que ça marche après tout ..
la source
Je sais que c'est un peu une vieille question, mais j'ai pensé que peut-être quelqu'un comme mon truc. D'autant que cette solution ne se limite pas à un nombre spécifique d'articles.
La sortie sera:
la source