Merci pour vos retour, j'ai modifié mon précédent post pour qu'il soit plus compréhensible.
Merci pour vos retour, j'ai modifié mon précédent post pour qu'il soit plus compréhensible.
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Oui je suis sous unix, mais qu'appelle tu propriétaire ? Ca va faire 1 an que j'ai decouvert unix/linux ( mieux vaut tard que jamais ), a l'issue d'un chgt de poste du coup je suis un peu novice ds le domaine...
Je n'ai pas la main sur l'installation des packages ou autres, je ne suis pas root et je suis incapable de répondre a ta question a savoir est-ce que j'utilise des commandes issue du package gnu. Obscurantisme...
Pour la dernière question il y a beaucoup de scripts écrient en tcsh ou en perl dans mon service. J'ai vu que certains scripts écrient en tcsh sont appelés depuis les scripts perl donc qui cohabitent et lisant le post de jack-ft apparemment on peut merger des scripts tcsh/csh avec du bash ou ksh.
Pour conclure je vais l'écrire en bash il est temps de faire la bascule ( au départ je suis resté en tcsh par que j'ai quelques connaissance en C du coup ej me suis dis que cela serait plus facile a appréhender ).
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Merci jack-ft pour ton aide.
Pour info j'ai mis a jour mon précédent post en esperant que mon problème soit plus compréhensible...
J'ai bien pris note des commandes a tester dans mon terminal. J'essayerai lundi afin de voir ce que cela donne.
Merci pour cette astuce je garde précieusement l'info car tôt ou tard je ne vais pas y échapper... Enfin ca risque surtout de me faciliter la vie au lieu de réécrire la roue .
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Voici un exemple en awk qui crée les fichiers pour les 2 fichiers et te dis quel fichier est apairé avec l'autre:
ATTENTION: ici je considère que tes 2 fichiers vont créer le même nombre de fichiers et que chaque fichier venant de My.TXT à un fichier venant de Mysecond.TXT qui lui correspond.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $ ls Mysecond.TXT My.TXT $ awk '/^CELL/ {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}} F {print >> "fichier_db" F ".txt";next} {print >> "fichier" D ".txt"}END{for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}' My.TXT Mysecond.TXT fichier3.txt fichier_db2.txt fichier1.txt fichier_db3.txt fichier2.txt fichier_db1.txt $ ls fichier1.txt fichier2.txt fichier3.txt fichier_db1.txt fichier_db2.txt fichier_db3.txt Mysecond.TXT My.TXT
Cordialement.
Unix est un standard, toutes les implémentations de ce standard ont leur propre nom. Certaines sont open source, d'autres ne le sont pas. Ce sont ces dernières que l'on dit propriétaires.
Essaie les commandes suivantes, ça nous donnera une idée du système sur lequel tu travailles:Ca va faire 1 an que j'ai decouvert unix/linux ( mieux vaut tard que jamais ), a l'issue d'un chgt de poste du coup je suis un peu novice ds le domaine...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 uname -a cat /etc/*release type awk nawk gawk awk --versionC'est une grosse blague qui dure depuis bientôt 40 ans, la syntaxe de csh n'a à peu près rien de commun avec le langage C.au départ je suis resté en tcsh par que j'ai quelques connaissance en C du coup ej me suis dis que cela serait plus facile a appréhender
ɹǝsn *sıɹɐlos*
C'était bien ce qu'il me semblait avoir compris: l'ordre des différents "éléments" ("CELL alpha 1", "CELL giga_2", "CELL misc_3"...) n'est pas forcément le même dans les 2 fichiers conteneurs "My.TXT" et "Mysecond.TXT" et n'a pas vraiment d'importance. N'est-ce pas?
Du coup, ne serait-ce pas plus logique de nommer les fichiers intermédiaires en fonction de ce qu'on trouve dans la ligne "CELL".
Ainsi l'analyse de "My.TXT" séparerait les données des différents CELL en produisant, dans cet ordre, 3 fichiers:
tandis que l'analyse de "Mysecond.TXT" produirait, dans cet ordre, les fichiers:
Code : Sélectionner tout - Visualiser dans une fenêtre à part "fichier-alpha-1.txt" "fichier-giga-2.txt" "fichier-misc-3.txt",
L'analyse de comparaison reviendrait alors à faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part "fichier-db-giga-2.txt" "fichier-db-misc-3.txt" "fichier-db-alpha-1.txt"
ce qui peut aisément être réalisé avec une boucle (sans s'occuper de l'ordre de création) et une petite manipulation de nom de fichier, comme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 diff fichier-alpha-1.txt fichier-db-alpha-1.txt diff fichier-giga-2.txt fichier-db-giga-2.txt diff fichier-misc-3.txt fichier-db-misc-3.txt
Avec "awk", j'imagine que certains experts pourront même faire tout ça en ram (lecture des 2 fichiers conteneurs et sans passer par les fichiers intermédiaires "fichier*.txt")...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for dbfile in *-db-*.txt; do file=${dbfile/-db/} # si ton shell le supporte file=$(echo "$dbfile" | sed -e 's/-db//') # si ton shell ne supporte pas la ligne précédente echo "======== Voici les différences entre '$file' et '$dbfile' ========" diff "$file" "$dbfile" end
Avis aux amateurs...
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Au lieu de type qui est une built-in bash, il aurait fallu utiliser which, mais c'est pas grave, on a assez d'informations pour dire que cette discussion aurait plus sa place dans le forum "shell et commandes gnu" (voir si un admin veut bien la déplacer...)
Cordialement.
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
J'ai testé la commande, j'ai quasiment le mm comportement sauf j'ai un fichier en plus et le fichier3.txt qui intègre le début du fichier source Mysecond.txt
fichier.txt:
-----------My.TXT----------
fichier3.txt:
CELL misc_3
toto b.1
toto b.2
toto c.4
toto e.8
toto j.1
---------------------------
-----------Mysecond.TXT----------
Pour le coup j'essaye de comprendre précisement ce que fait la commande awk.
Merci pour ton aide
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
J'avais pas compris que les lignes du genre '------My.TXT-----' était réellement dans tes fichiers...
Et donc, dans ce cas, comment peuvent fonctionner les 2 awk que tu utilises déjà ?
Cordialement.
"which" avait déjà été demandé, j'ai ajouté "type" qui est une commande standard POSIX, pas seulement bash. Quand elle est exécutée par un shell de type Bourne, elle peut donner des informations utiles sur la façon dont le shell interprète la commande passée en argument, ce que which ne peut pas faire. Si elle retourne "type not found", on obtient aussi une information intéressante.
ɹǝsn *sıɹɐlos*
erratum cela fonctionne correctement, effectivement a aucun moment j'ai mentionné qu'il y avait ces lignes en plus.
Par contre ce sont des fichiers exemples que j'ai mentionné les fichiers que je souhaites traités sont un peu différent mais comme je ne voulais pas ajouter de la complexité lors de l'explication de mon pb.
Les fichiers que je souhaites traités commence toujours par:
--- RULECHECK RESULTS STATISTICS (BY CELL)
---
Du coup j'ai un fichier.txt avec cette phrase ==> --- RULECHECK RESULTS STATISTICS (BY CELL) et pas de fichier_db.txt car cette phrase est inclu dans le dernier fichierxx.TXT
Ce que je pense comprendre:
==> dès que l'on rencontre cette chaine de caractère ou si la ligne commence par cette chaine de caractère ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ^CELL/
==> Si C[$0] (CELL ?) exist on incrémente F sinon on incrémente D ( pas sur d'avoir compris) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}}
==> Je pense qu'il y a une redirection du contenu mais je ne comprends pas bien le mecanisme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part F {print >> "fichier_db" F ".txt";next}
==> idem
Code : Sélectionner tout - Visualiser dans une fenêtre à part {print >> "fichier" D ".txt"}END
je connais le principe de la boucle for par contre la j'ai du mal pour tout faire recoupé. Je devine que i vaudra successivement 0,1,2 etc ( depend du nbre précédent d'incrémentation) in = i Max? et pour C je ne sais pas ( d'habitude ca incrémente ou ce décrémente ) puis on affiche les deux fichiers si ils ont la même entête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part {for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}'
Svp ayez de l'indulgence fasse a mon faible niveau
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Si la ligne que tu parles est toujours la première de tes fichiers, tu devrais pouvoir résoudre le problème en disant à awk de passer à la suivante si c'est la première ligne du fichier, cela donnerait donc la modification suivante (en rouge) :
Sinon, pour mieux comprendre comment fonctionne le script awk, revoici (juste le code awk) en indenté:
Code : Sélectionner tout - Visualiser dans une fenêtre à part $ awk 'FNR == 1 {next} /^CELL/ {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}} F {print >> "fichier_db" F ".txt";next} {print >> "fichier" D ".txt"}END{for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}' My.TXT Mysecond.TXT
Code awk : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 FNR == 1 { next } /^CELL/ { if(exist C[$0]){ E[$0]=++F } else{ C[$0]=++D } } F { print >> "fichier_db" F ".txt" next } { print >> "fichier" D ".txt" } END{ for (i in C){ print "fichier" C[i] ".txt fichier_db" E[i] ".txt" } }
Cordialement.
Julien, que penses-tu de ma proposition précédente (nommer les fichiers de CELL)?
L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com
Voici un explicatif du script awk, mais regarde la proposition de Jack-ft, celle-ci à le mérite de montrer tout de suite comment sont apairés tes fichiers sans avoir besoin de regarder dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 FNR == 1 { next } #La variable FNR contient le numero de ligne du fichier en cours de lecture. #Ici, on passe à l'itération suivante (donc la ligne suivante), si FNR = 1. /^CELL/ { if(exist C[$0]){ E[$0]=++F } else{ C[$0]=++D } } #Si on rencontre le pattern '^CELL' (donc ligne qui commence par CELL) alors: #S'il existe déjà une association de la ligne dans le tableau C, cela veut dire que l'on a déjà rencontré la ligne CELL...., #et donc que l'on est en train de lire le deuxieme fichier et comme celui-ci n'a pas obligatoirement le même index, on le stocke dans E. #Sinon, c'est que l'on est dans le premier fichier, et donc on stocke l'index dans C. #PS: Au lieu de généré un index spécifique au deuxieme fichier (E[$0]=++F), on pourrait directement récupérer l'index que l'on a généré pour le premier fichier (F=C[$0]), comme ceci, le fichier fichier1.txt aurait comme correspondant fichier_db1.txt, etc... F { print >> "fichier_db" F ".txt" next } #Là, on passe par un racourci: si F est défini et différent de 0, alors c'est que l'on est dans le deuxieme fichier, donc on ecrit dans le fichier avec une #racine au deuxieme fichier et d'index F (c'est le même principe que ton deuxième awk en fait). #puis on passe à l'itération suivante (donc la ligne suivante). { print >> "fichier" D ".txt" } #ici, c'est l'écriture lié au premier fichier. on passe ici que si les condition FNR == 1 et que F existe et différent de zéro sont fausses. END{ for (i in C){ print "fichier" C[i] ".txt fichier_db" E[i] ".txt" } } #Ce bloque n'est executé que quand tous les fichiers en entrée ont été traités: #'C' est un tableau et i prendra à chaque tour, l'index suivant du tableau associatif C qui n'est pas un nombre mais l'une des ligne CELL...
Cordialement.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager