#1 Le 12/04/2010, à 13:46
- bece
[résolu] récupérer le numéro d'une colonne avec awk
Bonjour,
J'ai un fichier qui ressemble à ceci :
toto azerty 042
tata azertu 21
titi qsdfgh 51
Comment récupérer le numéro de la colonne qui contient azerty avec awk ?
Je me doute que c'est tout simple, mais je ne connais pas grand chose en awk
Merci d'avance
Dernière modification par bece (Le 12/04/2010, à 17:31)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#2 Le 12/04/2010, à 13:57
- credenhill
Re : [résolu] récupérer le numéro d'une colonne avec awk
hello
awk -v var="azerty" '{for(n=1;n<=NF;n++)if($n == var)print n}' fichier
En ligne
#3 Le 12/04/2010, à 14:05
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
oki, merci, ça fonctionne parfaitement
Mais si je veux faire un traitement sur cette valeur récupérée : est-ce que ceci fonctionne :
awk -v var=azerty '{for(n=1;n<=NF;n++)if($n == var)var = n}{traitement ...}' fichier
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#4 Le 12/04/2010, à 14:13
- sputnick
Re : [résolu] récupérer le numéro d'une colonne avec awk
A peu près la même chose ( même algo ) mais j'indente différemment, je donne le numero de ligne et je rajoute un exit pour ne pas avoir à parser tout le fichier si il n'y a qu'une occurrence à trouver dans un fichier de 4GO :
awk -vPATTERN=azerty '{
for (i=1; i<=NF; i++) {
if ($i == PATTERN) {
print "Ligne", NR, "Colonne", i
exit
}
}
}' <FICHIER>
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#5 Le 12/04/2010, à 14:21
- sputnick
Re : [résolu] récupérer le numéro d'une colonne avec awk
Ok, avec un traitement sur la variable :
awk -vvar=azerty '{
for (i=1; i<=NF; i++) {
if ($i == var) {
gsub($i, "&modified")
print $i
exit
}
}
}' <FICHIER>
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#6 Le 12/04/2010, à 14:21
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
Non, mon fichier ne fait que 10 lignes grand max.
Mais si à la suite du for je veux récupérer le i (pour sputnick) ou le n (pour credenhill) pour le tester avec une autre variable, c'est possible ? Si oui, comment, je peux faire ça ?
Egalement, après -v est-ce que je peux déclarer 2 variables ?
EDIT : Oki, pour ma première question, elle n'est plus d'actualité, merci
Dernière modification par bece (Le 12/04/2010, à 14:23)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#7 Le 12/04/2010, à 14:26
- credenhill
Re : [résolu] récupérer le numéro d'une colonne avec awk
oui, ce code va être exécuté pour chaque ligne
awk -v var="azerty" '{for(n=1;n<=NF;n++)if($n == var)col=n ; traitement}'
mieux vaut se limiter aux lignes qui contiennent azerty
awk -v var="azerty" '$0 ~ var {for(n=1;n<=NF;n++)if($n == var)col=n ; traitement}'
traitement est dans le même block {} que le test, sinon il va s'appliquer à toutes les lignes
edit : tu peux faire : awk -v var="azerty" -v var2=042 ...
il faut modifier le test, par ex. if($n == var || $n == var2 )print n
Dernière modification par credenhill (Le 12/04/2010, à 14:33)
En ligne
#8 Le 12/04/2010, à 14:32
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
Merci, ta deuxième ligne, celle qui contient '$0 ~ var' m'aide beaucoup, mais le tilde veut dire quoi exactement ?
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#9 Le 12/04/2010, à 14:39
- sputnick
Re : [résolu] récupérer le numéro d'une colonne avec awk
Faut quand même que tu apprenne les bases des bases ^^
Le tilde est une comparaison par expression reguliere.
man awk :
~ !~ Correspondance (négation) d'expressions rationnelles. NOTE : N'utilisez pas d'expression rationnelle constante (/foo/) du côté gauche d'un ~ ou un !~. N'en utilisez que du côté
droit. L'expression /foo/ ~ exp a la même signification que (($0 ~ /foo/) ~ exp). Ce n'est d'habitude pas ce à quoi on s'attendait.
Attention, cela matche :
awk -vvar=foo '$0 ~ var{print}' <<< zodbfoopouet
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#10 Le 12/04/2010, à 14:40
- credenhill
Re : [résolu] récupérer le numéro d'une colonne avec awk
le ~ veut dire qui contient
$0 ~ /aaa/ la ligne contient aaa
$0 !~ /zzz/ la ligne ne contient pas zzz
$2 ~ /bbb/ le champ 2 contient bbb
$3 ~ /^ccc$/ le champ 3 contient exactement ccc , est égal à : $3 == "ccc"
En ligne
#11 Le 12/04/2010, à 16:29
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
Oki, merci pour les renseignements
A votre avis qu'y a-t-il de faux dans cette syntaxe :
awk -v var=$1 '$0 ~ var {for(n=1;n<=NF;n++)if($n == var)col=n ; if(NF<11)col=10-NF+col ; print col}' fichier
Il me retourne 4 valeurs au lieu d'une seule ??
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#12 Le 12/04/2010, à 16:39
- Postmortem
Re : [résolu] récupérer le numéro d'une colonne avec awk
Salut,
Avec cette ligne, il te retourne la valeur de 'col' pour chaque ligne qui contient la valeur de 'var'.
Je ne peux pas t'en dire plus car je ne vois pas trop ce que tu veux faire.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 12/04/2010, à 17:07
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
Cette ligne sans
if(NF<11)col=10-NF+col
m'affiche qu'une seule valeur.
Cette condition c'est juste pour gérer les trous car sur certaine ligne le fichier peut se présenter avec des champs en moins, or awk ne gère pas les trous.
Une ligne qui contient : 'trou' 'trou' azerty toto ... (il ne considère pas les trous comme des champs.)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#14 Le 12/04/2010, à 17:17
- Postmortem
Re : [résolu] récupérer le numéro d'une colonne avec awk
Si j'ai bien compris, je ferais donc comme ça :
awk -v var=$1 '$0 ~ var {for(n=1;n<=NF;n++)if($n == var){col=n ; if(NF<11)col=10-NF+col ; print col}}' fichier
J'ai juste rajouté une paire d'accolades
Edit : petite correction, j'avais ouvert l'accolade au mauvais endroit !
Dernière modification par Postmortem (Le 12/04/2010, à 17:21)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#15 Le 12/04/2010, à 17:30
- bece
Re : [résolu] récupérer le numéro d'une colonne avec awk
Oui, j'avais mis ça mais sans les parenthèses, et ça à l'air de fonctionner.
En faite le problème venait du fait que j'ais mal fait le grep qui précède le awk
Donc merci beaucoup à tous pour m'avoir retirer une épine du pied
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#16 Le 12/04/2010, à 19:08
- johndo
Re : [résolu] récupérer le numéro d'une colonne avec awk
Bonjour,
Une autre solution pour déterminer le n° de colonne :
awk -v val=$1 ' BEGIN {fs=FS"*";FS=fs val fs} $0 ~ val {print split($1,res, fs)+1}' fichier
Dernière modification par johndo (Le 12/04/2010, à 19:09)
Hors ligne
#17 Le 12/04/2010, à 19:43
- Postmortem
Re : [résolu] récupérer le numéro d'une colonne avec awk
awk -v val=$1 ' BEGIN {fs=FS"*";FS=fs val fs} $0 ~ val {print split($1,res, fs)+1}' fichier
Dis, tu m'expliquerais ta commande johndo ??
Merci d'avance !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#18 Le 12/04/2010, à 21:40
- johndo
Re : [résolu] récupérer le numéro d'une colonne avec awk
BEGIN
Section qui sera exécutée avant la 1ère ligne des fichiers à traiter
fs=FS"*" :
Sauvegarde du Field Separator et ajout du méta-caractère "*"
FS=fs val fs :
Définition du Field Separator. L'objectif est de définir comme séparateur la valeur recherchée entourée de blancs.
$0 ~ val :
Si la ligne contient la valeur recherchée
(au passage, il serait plus judicieux de le remplacer par $0 ~ FS)
print split($1,res, fs)+1:
Cette instruction est conditionnée par le test précédant.
Si $0 contient la valeur recherchée, alors $1 vaut tout ce qui précède. Il ne reste plus qu'à compter le nombre de colonne qui se trouve dans $1 et ajouter 1 (car val était à la colonne suivante). C'est ce que retourne la fonction split après avoir décomposé $1 en un tableau res en considérant que le séparateur de colonne est la valeur de la variable fs.
Hors ligne
#19 Le 12/04/2010, à 22:37
- sputnick
Re : [résolu] récupérer le numéro d'une colonne avec awk
Pour ceux qui ont toujours pas compris,
BEGIN{
fs=FS"*" Le séparateur de champs par défaut est un espace, on lui colle un *
FS=fs val fs est une concatenation. fs vaut donc " *" val déclaré au début avec l'option -v et encore fs.
Donc ca donne " *pattern *" comme séparateur de champ.
C'est comme si on écrivait par exemple pour azerty :
awk -v val=azerty '
BEGIN{
FS=" *azerty *"
}
$0 ~ FS {
print split($1,res, " *")+1
}'
Ce qui revient au bout du compte à taper :
awk -F' *azerty *' '$0 ~ FS {print split($1,res, " *")+1}' <FICHIER>
( Edited concernant l'erreur )
Dernière modification par sputnick (Le 13/04/2010, à 00:07)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#20 Le 12/04/2010, à 22:49
- johndo
Re : [résolu] récupérer le numéro d'une colonne avec awk
print split($1,res, " *azerty *")+1
...
awk -F' *azerty *' '$0 ~ FS {print split($1,res)+1}' <FICHIER>
Petites erreurs :
print split($1,res, " *")+1
...
awk -F' *azerty *' '$0 ~ FS {print split($1,res," *")+1}' <FICHIER>
Dernière modification par johndo (Le 12/04/2010, à 22:56)
Hors ligne
#21 Le 13/04/2010, à 00:03
- sputnick
Re : [résolu] récupérer le numéro d'une colonne avec awk
Oups, je me suis emmêlé entre deux version de <FICHIER> lors de mes tests
Pourquoi doit on lui donner un wildcard à cet espace comme 3° argument à split " *" johndo ?
Il semble qu'un espace seul suffise même si il y a plus d'un caractère espace.
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#22 Le 13/04/2010, à 09:14
- johndo
Re : [résolu] récupérer le numéro d'une colonne avec awk
Pourquoi doit on lui donner un wildcard à cet espace comme 3° argument à split " *" johndo ?
Il semble qu'un espace seul suffise même si il y a plus d'un caractère espace.
Oui tu as raison. Dans ma logique, le séparateur à utiliser était la valeur par défaut de FS. Comme elle est changée, j'ai utilisé fs qui s'en apparente sans vraiment chercher plus loin.
Hors ligne
#23 Le 13/04/2010, à 11:18
- Postmortem
Re : [résolu] récupérer le numéro d'une colonne avec awk
Merci à vous !!
C'est fou comment on peut s'amuser avec awk !! On en découvre tous les jours !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne