[awk] traiter une variable et non un fichier ?

Résolu/Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 30 avril 2013 à 19:47
dubcek Messages postés 18769 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 30 mars 2025 - 1 mai 2013 à 12:08
Salut,

J'ai une variable qui contient des chiffres bêtement séparés par des espaces :
A=154 210 99 12 139 242 198 92 147

Et j'aimerai les scinder par groupes de trois.

Je m'oriente donc vers awk, pour commencer, mais cette commande ne fonctionne pas :
awk -v var=${A} -F " " '{print $1 $2 $3}'

qu'est-ce que je fais de faux ?

Merci !!
A voir également:

5 réponses

dubcek Messages postés 18769 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 30 mars 2025 5 630
1 mai 2013 à 12:08
hello
sans echo et sans for
$ A="154 210 99 12 139 242 198 92 147"
$ awk 'BEGIN{RS=FS} {++n%3? c="": c="\n" ; printf $0 FS c}' <<<"$A"
154 210 99 
12 139 242 
198 92 147
 
dans un tableau
$ awk 'BEGIN {RS=FS; n=m=1} {t[n, m]=$0; if(NR%3)m++; else {n++; m=1}} END{for (n=1; n<4 ; n++)for(m=1; m<4; m++)print "t[" n, m "]", t[n, m]}' <<<"$A"
t[1 1] 154
t[1 2] 210
t[1 3] 99
t[2 1] 12
t[2 2] 139
t[2 3] 242
t[3 1] 198
t[3 2] 92
t[3 3] 147

2
Utilisateur anonyme
30 avril 2013 à 22:09
salut,

qu'est-ce que je fais de faux ?
tu n'utilises pas de guillemets!

$ A="154 210 99 12 139 242 198 92 147"
$ awk -v var="${A}" 'BEGIN{n=split(var,a);for(i=1;i<=n;i++){printf(i%3?"%d ":"%d\n",a[i])}}'
154 210 99
12 139 242
198 92 147
1
mamiemando Messages postés 33612 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 1 avril 2025 7 836
1 mai 2013 à 11:36
La solution de mamie ne fonctionne pas très bien : au lieu de prendre les valeurs triplets après triplets, ça shift les triplets d'une seule unité au lieu de 3.

Tu as raison j'ai fait une erreur dans le code que j'avais donné, toutes mes excuses. J'ai supprimé le message en question puisque la solution est fausse.

Voici la version corrigée qui me semble faire ce qu'il faut :

(mando@silk) (~) $ A="154 210 99 12 139 242 198 92 147"
(mando@silk) (~) $ echo $A | awk '{for (i = 1; i + 2 <= NF; i += 3) {print $i, $(i+1), $(i+2)} }'
154 210 99
12 139 242
198 92 147


Bonne chance
1
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 1/05/2013 à 12:40
ça marche ! merci ! :) il n'y a pas besoin de t'excuser pour si peu !!
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
1 mai 2013 à 02:20
Salut,

La solution de mamie ne fonctionne pas très bien : au lieu de prendre les valeurs triplets après triplets, ça shift les triplets d'une seule unité au lieu de 3.

La solution de qqchquicommenceparq est fonctionnelle par contre.

Maintenant : comment conserver les triplets dans un tableau ?
J'ai déjà une double boucle for (une sur i, et une sur j) pour faire un calcul, et cette ligne awk vient au milieu ;
je souhaite donc conserver les triplets dans des variables comme ceci :
variable[${i}${j}]=le premier triplet pour i=1 & j=1
le deuxième triplet sera conservé dans variable[12], le troisième dans variable[13] et ainsi de suite, le tableau étant carré.
Donc si j'ai 9 cases, le quatrième triplet doit être contenu dans variable[21] et le dernier dans variable[33] dans ce cas précis ; le nombre de case étant lui aussi variable.

Un peu comme les coordonnées d'une grille si on veut. J'ai la dimension de cette grille dans une variable dimension, et je fais boucler mon i et mon j de 1 jusqu'à dimension par incrément de 1.

Merci beaucoup !
0
Utilisateur anonyme
1 mai 2013 à 04:44
Si on savait tout de suite d'où on part (les données, qu'elles viennent d'un fichier ou de la sortie d'une commande), et où on doit aller (le résultat que vous souhaitez obtenir) !!!
Et montrez-nous vos scripts!

On t'a suivi pour une commande awk, maintenant c'est tout un script dans lequel awk n'est pas nécessaire, donc on recommence. C'est pénible !

En shell:
utilise un tableau pour stocker la variable que tu veux séparer en triplé
ensuite, tu appelles les éléments du tableau trois par trois

Mais il faut forcément utiliser une boucle for qui incrémentera les "indices"
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 1/05/2013 à 12:02
Salut,
Pour le problème "simple" on reprends au début ; j'ai rajouté un commentaire sous le post initial. C'est le problème à résoudre ici. Indépendamment du reste. J'ouvre un autre sujet pour différencier les choses.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 1/05/2013 à 02:24
ps : ma question était mal formulée ; comment le plus simplement du monde, je peux sortir le champ $1 d'une variable ? Mettons par exemple VAR="Salut Marcel" où le champ 1 est Salut et le 2 Marcel. Ils sont séparés simplement par une espace.

$ awk -v variable="${VAR}" -F " " '{print $1 $2 $3}'
ça ça ne fonctionne pas. Est-ce possible d'éviter un echo ? Et d'éviter un for incrémental ?
0