Recherche avec AWK + formatage

Résolu
Bonjour,

J'ai un fichier FILE1 ci-dessous


Douggoy-HR_1;Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1205;Douggoy-HR_1;5
Douggoy-HR_2;Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1206;Douggoy-HR_2;4
Douggoy-HR_3;Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1207;Douggoy-HR_3;5
Douggoy-HR_6;Douggoy-D-AG_EXN_002;16;7012;Maroua_Zokok-MX;70;21707;Douggoy-HR_6;6
Douggoy-HR_7;Douggoy-D-AG_EXN_002;16;7012;Maroua_Zokok-MX;70;21708;Douggoy-HR_7;6
Douggoy-HR_8;Douggoy-D-AG_EXN_002;16;7012;Maroua_Zokok-MX;70;21709;Douggoy-HR_8;6
Maroua-Marche-Abattoir-HR_1;Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;70;16511;Maroua-Marche-Abattoir-HR_1;3
Maroua-Marche-Abattoir-HR_3;Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;70;16513;Maroua-Marche-Abattoir-HR_3;6
Maroua-Marche-Abattoir-HR_6;Maroua-Marche-Abattoir-D_EXN_085;16;41321;Maroua_Zokok-MX;70;41321;Maroua-Marche-Abattoir-HR_6;6
Maroua-Marche-Abattoir-HR_7;Maroua-Marche-Abattoir-D_EXN_085;16;41321;Maroua_Zokok-MX;70;41322;Maroua-Marche-Abattoir-HR_7;4
Maroua-Marche-Abattoir-HR_8;Maroua-Marche-Abattoir-D_EXN_085;16;41321;Maroua_Zokok-MX;70;41323;Maroua-Marche-Abattoir-HR_8;6



je souhaiterais avoir le File2 ci-dessous en suivant la logique Douggoy-HR_1,Douggoy-HR_2,Douggoy-HR_6,Douggoy-HR_7,Douggoy-HR_8 en tenant compte du under score et du chiffre qui suit dans l'odre ci-dessus pour positioner le dernier champ de chaque ligne.

Par exemple Maroua-Marche-Abattoir_EXN_085 le _2 n'existe le dernier champ est remplacé par Zero en gras dans le File2.

File2

Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1205;5-4-5;6-6-6
Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;70;16511;3-0-6;6-4-6



Merci d'avance

7 réponses

  1. Modérateur
    Ce n'est pas super clair. Si j'ai bien compris tu groupes suivant la deuxième colonne (donc tu as les agrégats : Douggoy-AG_EXN_002, Douggoy-D-AG_EXN_002, Maroua-Marche-Abattoir_EXN_085, aroua-Marche-Abattoir-D_EXN_085).

    1) Déjà pourquoi dans ton exemple, il n'y a pas de ligne faisant intervenir les lignes D_EXN ?

    Ensuite si on regarde cette ligne :

    Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1205;5-4-5;6-6-6


    ... tu gardes 1205 (première ligne contenant Douggoy-AG_EXN_002, 6e colonne).

    2) Donc tu ignores les valeurs colonne 6 intervenant dans les lignes suivantes ? (1206, 1207) ? Pourquoi ?

    Ensuite tu as deux triplets (5-4-5) et (6-6-6). Si j'ai bien compris cela correspond aux valeurs apparaissant dans la dernière colonne pour les agrégats Douggoy-AG_EXN_002, Douggoy-D-AG_EXN_002.

    3) Est-ce bien ça ?

    Dans les grandes lignes :
    - change ton input field separator (IFS en awk) pour utiliser ";" (option -F, ou initialise IFS dans la section BEGIN)
    - Lis ton fichier ligne par ligne et vérifie qu'elle forme bien un tableau de 8 cellules.
    - Tu peux extraire dans la 2e colonne la partie qui t'intéresse en splittant la chaîne sur le caractère '_' (voir fonction patsplit).
    - Ensuite il faut maintenir un tableau dans lequel tu mémorises les valeurs correspondants dans File 2 aux deux dernières colonnes.
    https://www.thegeekstuff.com/2010/03/awk-arrays-explained-with-5-practical-examples/

    Bonne chance
    1. Bonsoir mamiemando

      Bonne et heureuse annee 2015

      Merci pour ton retour .

      En effet j'ai fait une erreur dans le fichier de sortie File2 , ci-dessous ce que je devrait obtenir normalement :

      File2

      Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1205;5-4-5
      Douggoy-D-AG_EXN_002;16;7012;Maroua_Zokok-MX;70;21707;6-6-6
      Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;70;16511;3-0-6
      Maroua-Marche-Abattoir-D_EXN_085;16;41321;Maroua_Zokok-MX;70;41321;6-4-6


      Merci

      Cdlt.
      1. Modérateur
        Et du coup avec les indications que je t'ai données, tu es débloqué ? Meilleurs voeux également :-)
        1. Contributeur
          hello
          bonne année
          quel est le critère pour le champ 6 ?
          $ awk -F ";" '{p=FS; s[$2]=$9 "-" s[$2]; t[$2]=$2 p $3 p $4 p $5 p $6 p $7} END {for (n in t){$0=t[n] p s[n]; sub("-$", ""); print}}' fichier | sort
          Douggoy-AG_EXN_002;8;7005;Maroua_Zokok-MX;70;1207;5-4-5
          Douggoy-D-AG_EXN_002;16;7012;Maroua_Zokok-MX;70;21709;6-6-6
          Maroua-Marche-Abattoir-D_EXN_085;16;41321;Maroua_Zokok-MX;70;41323;6-4-6
          Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;70;16513;6-3
          1. Bonjour Dubcek

            Meilleur voeux ,

            desole ,Normalement le champ 5 et 6 j en aurais plus besoin.
            donc je devrais avoir ceci


            $ awk -F ";" '{p=FS; s[$2]=$9 "-" s[$2]; t[$2]=$2 p $3 p $4} END {for (n in t){$0=t[n] p s[n]; sub("-$", ""); print}}' file1.txt

            Maroua-Marche-Abattoir-D_EXN_085;16;41321;6-4-6
            Douggoy-AG_EXN_002;8;7005;5-4-5
            Douggoy-D-AG_EXN_002;16;7012;6-6-6
            Maroua-Marche-Abattoir_EXN_085;16;16511;6-3


            juste que pour cette ligne (Maroua-Marche-Abattoir_EXN_085;16;16511;6-3) je voudrais avoir


            Maroua-Marche-Abattoir_EXN_085;16;16511;Maroua_Zokok-MX;3-0-6


            le Zero represente la ligne Maroua-Marche-Abattoir-HR_2 qui n'existe pas dans le fichier initial.

            Merci Beaucoup encore pour ton coup de main

            cdlt
            1. Contributeur
              commet trouver celle qui manque
              toutes les lignes sont par groupe de 3, avec 123 ou 678 dans le premier champs ?