[awk] traiter une variable et non un fichier ?
Résolu
Swiss Knight
Messages postés
1956
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
A voir également:
- [awk] traiter une variable et non un fichier ?
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
5 réponses
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
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
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
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"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?