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. Contributeur
    commet trouver celle qui manque
    toutes les lignes sont par groupe de 3, avec 123 ou 678 dans le premier champs ?
    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
        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. Modérateur
          Et du coup avec les indications que je t'ai données, tu es débloqué ? Meilleurs voeux également :-)
          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
              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