Forum Programmation.shell passer des paramettres à AWK

Posté par  .
Étiquettes : aucune
0
2
août
2005
fichier1:

1 toto1 adresse1
2 toto2 adresse2
3 toto3 adresse2

fichier2:

toto1
toto3

resultats :

1 toto1 adresse1
3 toto3 adresse2

c.a.d avoir les lignes de fichier1 dont le 2 eme champ correspond au 1er champ du fichier2
voilà ou je suis :

#! /bin/sh
for i in `cat fichier2`
do
awk '$2 ~ /system("`$i`")/ { print $0 }' fichier2
done


ça marche pas !!
Merci
  • # et grep ?

    Posté par  . Évalué à 2.

    bon, ça répond pas à la question en awk, mais vu que tu fais déjà une boucle sur tous les éléments de fichier2, pourquoi ne pas remplacer ton awk par un grep bien choisi ? (à mon avis plus performant)
    • [^] # Re: et grep ?

      Posté par  . Évalué à 2.

      ca marchera pas si dans adresse2 il y a la chaine toto1 je pense.
      (adresse2 = à_gauche_de_la_maison_de_toto1 par exemple)
      • [^] # Re: et grep ?

        Posté par  (site web personnel) . Évalué à 2.

        grep -w permet d'éviter ça...
        Mais si son champ de recherche peut ne pas être unique, grep ne lui sera pas très utile dans ce cas...
      • [^] # Re: et grep ?

        Posté par  . Évalué à 2.

        oui, c'était pas explicite, mais c'était le sens de mon "grep bien choisi". Par exemple avec une petite regex histoire d'aller taper dans le bon champ.
  • # pour awk

    Posté par  . Évalué à 2.

    déjà, tu voulais surement taper fichier1 dans ta ligne de awk. A mon avis, c'est une typo.
    Sinon, tu as un problème sur le system("`$i`"). $i n'est pas défini pour awk. Vu que awk est un nouveau process, il n'hérite pas de la variable $i. Pour que awk connaisse $i, il faut que tu rajoutes "export i" dans ta boucle.

    Je ne sais pas si ça suffit (pas testé), mais ça ne peut que améliorer les choses :)
    • [^] # Re: pour awk

      Posté par  . Évalué à 2.

      Ou sinon il y a moyen de concaténer le $i du shell avec le script awk, avec des apostrophes bien placées ;) :
      awk '$2 ~ /system("'$i'")/ { print $0 }' fichier2

      Mais en fait je ne vois pas à quoi sert system, il suffirait de faire :
      awk '$2 ~ /'$i'/ { print $0 }' fichier2
  • # Guillemets doubles

    Posté par  . Évalué à 2.

    Si tu utilise des guillemets doubles dans une chaine en shell (bash) les variables à l'intérieur sont évaluées. Il faut aussi échapper les $ que tu ne veux pas utiliser pour shell mais dans awk. Ca donne ça (testé sous bash avec cygwin pour W2k)

    for i in `cat fic2`;do
    awk " \$2 ~ /$i/ { print \$0 }" fic1
    done
  • # ca marche ??

    Posté par  (site web personnel) . Évalué à 2.


    #! /bin/sh
    for i in `cat fichier2`
    do
    awk -v val=$i '$2 ~ val { print $0 }' fichier1
    done
    • [^] # Re: ca marche ??

      Posté par  . Évalué à 2.

      Essaye ca également:
      awk ' BEGIN {    while ( (getline < "fichier1") > 0 ){
              Tab[$1]=$0
          }
      }
      {
          print Tab[$1]
      }' fichier2
      
      
  • # Pourquoi pas join ?

    Posté par  . Évalué à 2.

    Une combinaison de join+cut donne le résultat et évite de boucler sur fichier1 et donc de le parcourir plusieurs fois:

    join -1 2 -2 1 fichier1 fichier2 | cut -f1,3 -d" "

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.