Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/04/2010, à 14: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 smile
Merci d'avance smile

Dernière modification par bece (Le 12/04/2010, à 18:31)


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#2 Le 12/04/2010, à 14: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

Hors ligne

#3 Le 12/04/2010, à 15:05

bece

Re : [résolu] récupérer le numéro d'une colonne avec awk

oki, merci, ça fonctionne parfaitement smile
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, à 15: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, à 15: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, à 15: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 smile

Dernière modification par bece (Le 12/04/2010, à 15:23)


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#7 Le 12/04/2010, à 15: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, à 15:33)

Hors ligne

#8 Le 12/04/2010, à 15: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, à 15: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, à 15: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"

Hors ligne

#11 Le 12/04/2010, à 17:29

bece

Re : [résolu] récupérer le numéro d'une colonne avec awk

Oki, merci pour les renseignements smile

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, à 17: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, à 18: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, à 18: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, à 18:21)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 12/04/2010, à 18: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 smile
Donc merci beaucoup à tous pour m'avoir retirer une épine du pied smile


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#16 Le 12/04/2010, à 20: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, à 20:09)

Hors ligne

#17 Le 12/04/2010, à 20:43

Postmortem

Re : [résolu] récupérer le numéro d'une colonne avec awk

johndo a écrit :
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, à 22: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, à 23: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, à 01:07)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#20 Le 12/04/2010, à 23:49

johndo

Re : [résolu] récupérer le numéro d'une colonne avec awk

sputnick a écrit :

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, à 23:56)

Hors ligne

#21 Le 13/04/2010, à 01: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 wink

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, à 10:14

johndo

Re : [résolu] récupérer le numéro d'une colonne avec awk

sputnick a écrit :

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, à 12: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