Construction d'un programme shell

Résolu/Fermé
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 - 21 juil. 2014 à 17:34
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 - 24 juil. 2014 à 11:34
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,
A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 juil. 2014 à 16:30
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
24 juil. 2014 à 11:34
Super un immense merci à toi.

Bravo l'artiste !!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 22/07/2014 à 10:49
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
Modifié par Benoit A. le 22/07/2014 à 12:11
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 12:25
Le script ne marche malheureusement pas. Il m'empile tous les résultats à la suite...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 22/07/2014 à 13:12
quel système ? essayer avec nawk
est-ce un .csv Windows qui contient des ^M ?
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 14:07
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
22 juil. 2014 à 14:11
sont-ce des .csv Windows qui contiennent des ^M ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
21 juil. 2014 à 18:41
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 12:40
Ca ne marche malheureusement pas non plus :(
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 08:47
Oui le nombre de caractère est exactement le même
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
22 juil. 2014 à 09:10
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
22 juil. 2014 à 13:02
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 13:13
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
22 juil. 2014 à 13:20
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 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
22 juil. 2014 à 14:11
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