Construction d'un programme shell

[Résolu/Fermé]
Signaler
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
-
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
-
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

Messages postés
18260
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
20 septembre 2021
5 370
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Super un immense merci à toi.

Bravo l'artiste !!
Messages postés
18260
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
20 septembre 2021
5 370
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";
Messages postés
18260
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
20 septembre 2021
5 370
est ce que perl et ces fonctions fonctionnent ?
$ perl -e 'use Time::Piece; my $t=Time::Piece->strptime($ARGV[0], "%d/%m/%Y"); print $t->strftime("%s\n")' "10/02/1970"
3452400
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Non malheureusement

Can't locate Time/Piece.pm in @INC (@INC contains: /usr/opt/perl5/lib/5.8.8/aix-thread-multi /usr/opt/perl5/lib/5.8.8 /usr/opt/perl.
BEGIN failed--compilation aborted at -e line 1.
Messages postés
18260
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
20 septembre 2021
5 370
je ne vois pas trop comment comparer des dates sans ces commandes ...
reste le C, tu peux compiler ?
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Non je ne peux pas. Mais je ne vois pas pourquoi tu veux utiliser la date ? Moi je ce que je souhaiterais c'est que si la ligne est la même hors mis la colonne 2 et 3 alors je prends le dernier enregistrement des lignes identifiés par exemple avec la même colonne 1.

N'est-il pas possible d'interpréter les colonnes 2 et 3 en tant que simple texte ? Et s'il est différent alors je prendre la ligne la plus ancienne ?

Je ne sais pas si tu vois ce que je veux dire ?
Messages postés
18260
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
20 septembre 2021
5 370
pour comparer 2 dates, je les transforme en secondes, après c'est une comparaison simple
si c'est juste le dernier enregistrement, alors c'est plus simple
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 374
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)
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Ca ne marche malheureusement pas non plus :(
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Oui le nombre de caractère est exactement le même
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 374
Tu fais les tests sur quoi ? Les fichiers finaux ?

Essaies déjà sur les 2 bouts de fichiers que tu m'as donné, et vois si ça marche déjà là...

Autre chose, les fichiers originaux sont sous quel format ? Unix ou DOS ?
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
Les fichiers originaux sont sur Unix
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 374
Tu en es sûr ? Ils sont créés sous Unix ?

Quid des essais sur les 2 fichiers de test ?

Au fait, quel système ?
Messages postés
454
Date d'inscription
mercredi 8 février 2012
Statut
Membre
Dernière intervention
13 août 2015
480
AIX
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 374
Je me répète : Quid des essais sur les 2 fichiers de test ?