Awk reperer les champs entre " "

Bonjour,

je cherche sous awk a recuperer la liste des choses se trouvant entre " "

ex :

"At1","Jamais","N'a pas pu d‚marrer","Jamais", "Lundi,Mardi, Mercredi, etc.."

j'aimerais recuperer pour chaque champ délimité par un " " , le recupere dans un fichier texte

merci de votre aide.
Configuration: Windows XP
Internet Explorer 6.0

4 réponses

  1. Modérateur
    En fait je ne pense pas que ce soit faisaible en awk car il y a une notion de mémoire (guillemets ouvrant et guillemets fermant). Ce sera par ailleurs difficile à faire simplement avec des cut notamment car la ',' n'est pas un séparateur (elle apparaît par exemple dans "Lundi,Mardi, Mercredi, etc.." ).

    Donc le plus simple c'est de faire un automate par exemple en C, qui va lire la chaîne caractère par caractère. Avec un système de bascule (variable i dans le programme qui suit) on peut mémoriser si on est en train de lire un caractère situé après un guillemet ouvrant ou un guillemet fermant. Voici comment on peut faire (copie colle ce fichier dans plop.c) :
    #include <stdio.h>
    
    int main(int argc,char **argv){
        FILE *fin,*fout;
        char c;
        int i = 0;
    
        if(argc<2){
            fprintf(stderr,"usage: %s filename_in filename_out\n",argv[0]);
            return 1;
        }
    
        // Ouvrir le 1er fichier en lecture
        if(!(fin = fopen(argv[1],"r"))){
            fprintf(stderr,"can't read %s\n",argv[1]);
            return 2;
        }
    
        // Ouvrir le 2e fichier en écriture
        if(!(fout = fopen(argv[2],"w"))){
            fprintf(stderr,"can't write %s\n",argv[2]);
            fclose(fin);
            return 3;
        }
    
        // Lire le 1er fichier caractère par caractère
        while( (c = fgetc(fin)) != EOF){
            // si on rencontre un guillemet on commence à recopier
            // le contenu de fin dans fout (ou au contraire on arrête)
            if(c == '"'){
                if(i % 2) fprintf(fout,"\n");
                ++i;
                continue; // on n'écrit pas le caractère courant (")
            }
    
            // si i est impair on écrit le caractère courant
            if(i % 2) fprintf(fout,"%c",c);
        }
    
        // Fermer les fichiers
        fclose(fin);
        fclose(fout);
        return 0;
    }

    Le programme se compile avec la commande (remplace pouet par un nom d'exécutable qui te convient) :
    gcc -W -Wall -o pouet plop.c

    Ensuite pour le lancer :
    ./pouet fichier_entree.txt fichier_sortie.txt

    Libre à toi d'utiliser habilement l'opérateur < du shell et les noms de device (/dev/stdout...) si tu veux chaîner ça dans un pipe |.

    Exemple : J'ai préparé un fichier plop.txt et je veux générer un fichier pouet.txt :
    (mando@aldur) (~) $ cat plop.txt
    "mais","N'a pas pu démarrer","Jamais", "Lundi,Mardi, Mercredi, etc.."
    (mando@aldur) (~) $ ./pouet plop.txt pouet.txt
    (mando@aldur) (~) $ cat pouet.txt
    mais
    N'a pas pu démarrer
    Jamais
    Lundi,Mardi, Mercredi, etc..

    Ici, on écrit directement sur la sortie standard, et on pipe ça (en tout bien tout honneur) avec un sort pour trier chaque ligne dans l'ordre alphabétique :
    (mando@aldur) (~) $ ./pouet plop.txt /dev/stdout | sort
    Jamais
    Lundi,Mardi, Mercredi, etc..
    mais
    N'a pas pu démarrer
    

    Bonne chance
    0
    1. Contributeur
      Salut,
      Sinon tu peux utiliser sed.
      $ cat ccm
      "At1","Jamais","N'a pas pu d‚marrer","Jamais","Lundi,Mardi, Mercredi, etc.." 
      
      $ sed -e 's/","/\n/g' -e 's/"//g' ccm
      At1
      Jamais
      N'a pas pu d‚marrer
      Jamais
      Lundi,Mardi, Mercredi, etc.. 
      


      Cdlt
      0
      1. Modérateur
        Sauf que... tu as triché :-) Il y avait un espace ici :
        ..."Jamais", "Lundi,Mardi,...

        Sinon oui en séparant sur la chaîne {","} c'est facile ^^
        0
        1. Contributeur
          Sauf que... tu as triché :-) Il y avait un espace ici :
          S'il n'y a que ça qui te gênes, tu rajoutes deux étoiles et deux espaces dans le motif, et tu peux même rajouter autant d'espaces que tu veux, que ce soit avant ou après la virgule ;-)

          $ cat nono
          "At1", "Jamais","N'a pas pu d‚marrer","Jamais",  "Lundi,Mardi, Mercredi, etc.."
          
          $ sed -e 's/" *, *"/\n/g' -e 's/"//g' ccm
          At1
          Jamais
          N'a pas pu d‚marrer
          Jamais
          Lundi,Mardi, Mercredi, etc.. 
          
          0
      2. Modérateur
        Salut,
        [tmpfs]$ cat plop
        "At1","Jamais","N'a pas pu d?marrer","Jamais","Lundi,Mardi, Mercredi, etc.."
        "At1", "Jamais","N'a pas pu d?marrer","Jamais",  "Lundi,Mardi, Mercredi, etc.."
        
        [tmpfs]$ sed 's/ *,* *"*\([^"]*\) *,* *"/\1\n/g' plop
        At1
        Jamais
        N'a pas pu d?marrer
        Jamais
        Lundi,Mardi, Mercredi, etc..
        
        At1
        Jamais
        N'a pas pu d?marrer
        Jamais
        Lundi,Mardi, Mercredi, etc..
        
        [tmpfs]$
        ;-))
        0