Construction d'un programme shell

Résolu
Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   -  
Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Je vous écris parce que je me retrouve face un petit problème que je n'arrive pas à résoudre depuis quelque jours. Je souhaiterai créé un shell qui créera un fichier avec deux conditions :

1 ère condition :

Voilà j'ai deux fichiers (mois en cours et mois-1) qui contiennent tous les deux plus de 1000 lignes et 22 colonnes qui sont sur un format CSV (séparateur ;). Dans ces deux fichiers, certaines lignes sont les mêmes. Je souhaiterais pouvoir créer un shell qui me permettrait de comparer toutes les lignes entre les deux fichiers afin de créer un troisième fichier où les résultats identiques ne seraient pas remontés sinon il reprend la ligne

Exemple :

(Fichier mois-1)
....
"199999";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
"188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
....

(Fichier mois)
....
"199999";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
"188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
....

(Fichier résultat shell)
....
"188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
....

2ème condition :

Dans le fichier résultat quand j'ai plusieurs lignes avec seulement la colonne 2 3 ou 4 qui change je souhaiterais récupérer le dernier résultat le plus vieux par rapport à la colonne 2. Idéalement le shell réécrirait sur le fichier résultat

Exemple (après la suppression des valeurs identiques par rapport au mois précédent):

(Fichier résultat) :
...
"199999";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
"199999";"01/05/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
"199999";"01/10/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
...

(Fichier après le shell)
...
"199999";"01/10/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
...

J'espère avoir été le plus clair possible avec tous ces exemples. Je remercie d'avance quiconque pourra m'aider.

Cordialement,

4 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    je prends les données Avant du post #21
    $ awk -F ";" '{t[$1]=$0} END {for (n in t)print t[n]}' fichier
    "123558";"10/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
    "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
    $
    2
    1. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Super un immense merci à toi.

      Bravo l'artiste !!
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    question: dans 1er exemple, on garde la ligne 188888.. du fichier mois, est-ce tjrs le cas, à savoir qu'à ligne différente, on garde celle de mois et pas mois-1 ?
    pour le 1 ex.
    $ awk 'ARGIND==1 {t[$0]=$0; next} !t[$0]' mois-1 mois
    "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
    1
    1. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Oui c'est ça. Je ne veux garder que les lignes différentes du fichier mois par rapport au fichier mois -1
      0
    2. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Le script ne marche malheureusement pas. Il m'empile tous les résultats à la suite...
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      quel système ? essayer avec nawk
      est-ce un .csv Windows qui contient des ^M ?
      0
    4. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Je le fais directement sur une machine linux. Mais le problème c'est que la commande
      $ awk 'ARGIND==1 {t[$0]=$0; next} !t[$0]' mois-1 mois
      deux fichiers l'un à la suite de l'autre. Il ne fait pas la comparaison.
      0
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      sont-ce des .csv Windows qui contiennent des ^M ?
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Pour ton 1er problème un simple
    fgrep -v -f fichier_mois-1 fichier_mois
    devrait te renvoyer le résultat escompté ;-)

    Par contre pour ton 2nd problème, est-ce que le nombre de caractère comprenant l'ensemble des champs 1, 2, 3 et 4 est constant ? (à savoir avec tes exemples, 39 caractères)
    0
    1. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Ca ne marche malheureusement pas non plus :(
      0
  4. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
     
    Oui le nombre de caractère est exactement le même
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Alors essaie ça :
      fgrep -v -f fichier-1 fichier | sort -r | uniq -s 39 | sort -t';' -k 2
      mais c'est sans garantie n'ayant pas assez de données pour optimiser la chose ;-\

      Mais en attendant un peu, dubcek devrait te concocter une formule magique dont il a le secret avec awk ;-))
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      On pourrait avoir un exemple plus conséquent de fichiers (une dizaine de lignes pour chacun + le résultat final) ?
      0
    3. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Fichier mois-1

      "199999";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "199851";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";

      Fichier mois

      "199999";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
      "199851";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"02/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"03/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      "123558";"10/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";


      Résultat attendu après les deux conditions :
      Suppressions des lignes identiques par rapport au mois -1 et récupération de la dernière ligne qui à une date en colonne 2 plus ancienne avec les mêmes caractéristiques..


      "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
      "123558";"10/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ben voilà le réusltat avec ma commande précédente (j'ai juste enlever le dernier sort, car le résultat était le même)

      $ fgrep -v -f f-1 f-mois | sort -r | uniq -s 39 
      "188888";"01/01/1900";" ";"01/12/9999";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"00125423";"N";"300";
      "123558";"10/02/1900";" ";"01/01/1900";"111111111";"00";"0";"AAAAAAAA";"CAD";" ";"55523";"9952122222";"P999";" ";"1";"SXXXX";"00";" ";"35.0";"11122510";"N";"300";
      0
    5. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Ca ne marche toujours pas pour moi. Le programme ne fait rien du tout .... Il se lance mais rien ne bouge. Je n'ai aucun résultat. Je suis obligé de le stopper avec ctrl+c pour annuler le prog. Sinon j'ai comme l'impression qu'il tourne dans le vide.

      Est-ce que cela peut être long ?
      0