[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
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
A voir également:
- [awk] traiter une variable et non un fichier ?
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir un fichier .bin - Guide
- Comment ouvrir un fichier docx ? - Guide
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
1 mai 2013 à 12:08
hello
sans echo et sans for
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 147dans 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
Utilisateur anonyme
30 avril 2013 à 22:09
30 avril 2013 à 22:09
salut,
qu'est-ce que je fais de faux ?
tu n'utilises pas de guillemets!
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
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
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 :
Bonne chance
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
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
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 !!
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
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 !
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 !
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"
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"
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
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.
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.
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
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 ?
$ 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 ?