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

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
 
Super un immense merci à toi.

Bravo l'artiste !!
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
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
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
quel système ? essayer avec nawk
est-ce un .csv Windows qui contient des ^M ?
0
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
sont-ce des .csv Windows qui contiennent des ^M ?
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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
Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
 
Ca ne marche malheureusement pas non plus :(
0
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
On pourrait avoir un exemple plus conséquent de fichiers (une dizaine de lignes pour chacun + le résultat final) ?
0
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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
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