Unix : script pour ajouter des lignes |
Bienvenue invité ( Connexion | Inscription )
Unix : script pour ajouter des lignes |
8 Apr 2014, 15:14
Message
#1
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
Bonjour,
En UNIX, comment écrire un script qui permetter d'ajouter dans le fichier A les lignes du fichier B après certains critère passé en paramètre ? Exemple : - Fichier A contient Citation ligne 1 ligne 2 ligne 4 ligne 3 ligne 5 ligne 6 - Fichier B contient Citation texte à insérer Je voudrais l'ajouter après la ligne 3 Donc fichier résultat : Citation ligne 1 ligne 2 ligne 4 ligne 3 texte à insérer ligne 5 ligne 6 --> ATTENTION, il ne s'agit pas de toujours insérer en ligne X, mais bien en fonction de critères variable dans le fichier A. Merci pour votre aide. Eddoul -------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
8 Apr 2014, 15:17
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
Ça va être difficile de répondre sans informations sur les critères qui permettent de déterminer la ligne où il faut insérer. Si ton critère c'est le numéro de ligne c'est simple, si ton critère c'est insérrer le fichier B après la dixième occurrence d'un mot trouvé dans une des lignes du fichier A passé en paramètre c'est un peu plus complexe.
-------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
8 Apr 2014, 15:31
Message
#3
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
c'est ça :
Citation insérrer le fichier B après la dixième occurrence d'un mot trouvé dans une des lignes du fichier A passé en paramètre
-------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
8 Apr 2014, 16:02
Message
#4
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
Très rapidement, mais le script est à améliorer. On insère le fichier fileB.txt après avoir trouvé la 10ème de "abc" dans le fichier fileA.txt
Code #!/bin/bash awk ' { for (i=1;i<=NF;i++) if ( $i == "abc") a++ print $1 if (a >= 10 && done != 1) { system("cat fileB.txt") done = 1 } } ' fileA.txt Ça fait une sortie à l'écran. Faut rediriger le flux dans le fichier souhaité (autre que fileA.txt sinon le serpent se mord la queue). Edit : inversion de lignes Ce message a été modifié par yponomeute - 8 Apr 2014, 16:19. -------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
8 Apr 2014, 16:19
Message
#5
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 964 Inscrit : 3 Nov 2005 Membre no 49 239 |
rapidement
Code head -3 ficA > resultat.txt cat ficB >> resultat.txt tail -4 ficA >> resultat.txt Citation insérrer le fichier B après la dixième occurrence d'un mot trouvé dans une des lignes du fichier A passé en paramètre Si tu pars du principe que les insert ne se ferons qu'aux frontières de ligne, c'est a toi de faire un autre script qui va chercher un mot dans un fichier et retournera le n° de la ligne. N° de ligne que tu passera au script de yponomeute ou du tiens ou du mien. En unix la règle est "Small is beautiful" --> donc faire des petits scripts qui font bien 1 chose et 1 seule Ce message a été modifié par noop - 8 Apr 2014, 16:25. |
|
|
8 Apr 2014, 16:23
Message
#6
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
merci, je vais regarder ça
-------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
9 Apr 2014, 06:59
Message
#7
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
j'ai regardé ton script mais il y a un truc qui ne va pas.
Pour chacune des ligne du fichier A, il insère toutes les lignes du fichier B. Script : Code awk ' { for (i=1;i<=NF;i++) if ( $i == "abc") a++ if (a >= 10 && done != 1) print $1 { system("cat FichierB") done = 1 } } ' FichierA Fichier A : Citation ligne 1 lifne 2 lifne 3 abc ligne 4 ligne 5 ligne6 Fichier B : Citation ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ---> Résultat : Citation [eyj@axvgvatxbdev03p]/users/eyj/test> ajouter_fichier.ksh ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ----------------------------------------- de plus, le script de ajoute les lignes du fichier B même si le critère n'est pas dans le fichier A Ce message a été modifié par Eddoul - 9 Apr 2014, 06:57. -------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
9 Apr 2014, 07:25
Message
#8
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 964 Inscrit : 3 Nov 2005 Membre no 49 239 |
bonjour, explique nous quel est ton critere. mon script te montrait la voie... et celui d'yponomeute etait une ebauche comme il te l'a dit
|
|
|
9 Apr 2014, 07:46
Message
#9
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
j'ai regardé ton script mais il y a un truc qui ne va pas. Pour chacune des ligne du fichier A, il insère toutes les lignes du fichier B. Il y a eu une màj du message hier à 17h19 pour corriger une inversion de lignes -------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
9 Apr 2014, 07:59
Message
#10
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
j'ai rectifié le script.
Il y avait une infersion dans le test : if (a >= 10 && done != 1) Voici : Code awk ' { for (i=1;i<=NF;i++) print $1 if ( $1 == "abc") { a++ if (a <= 10 && done != 1) { print "---> Critere trouve" system("cat FichierB") done = 1 } } } ' FichierA Seulement, il ne prend que les 6ier caractère du fichier A. Pourquoi ? Voici le résultat : Citation Ligne
Ligne libne libne libne libne abc ---> Critere trouve ----> Ligne 1 du fichier B ----> Ligne 2 du fichier B ----> Ligne 3 du fichier B ---------------------------------------- ligne ligne ligne ligne ligne6 Ce message a été modifié par Eddoul - 9 Apr 2014, 07:59. -------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
9 Apr 2014, 08:15
Message
#11
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 964 Inscrit : 3 Nov 2005 Membre no 49 239 |
avant toute chose, peux tu nous expliquer quel est ton critère ? ce serait sympa...on est en train de ramer dans le sable
|
|
|
9 Apr 2014, 08:33
Message
#12
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
Au boulot, on est sous Unix et Cobol.
J'ai 1.600 programmes à recompiler en automatique. J'aurai voulu ajouter des lignes de commentaires pour indiquer "recompilation automatique suite modif du COPY ........". J'aurai voulu mettre ces commentaires après la chaine de caractère "ENVIRONMENT DIVISION". Cette chaine de caractère peut être précédée par différents caractères et suivi d'espaces et de rien. Exemple : 000350 ENVIRONMENT DIVISION. Donc lors de la recompilation en automatique que j'ai dans un script, j'en profiterai un fichier qui contiendrait : Citation *----------------------------------------------------------------* * EYJ - 08.04.2014 - DI 788 - Recompilation suite modif T_xxxxxx * *----------------------------------------------------------------* Voici un exemple de programme COBOL : Citation IDENTIFICATION DIVISION.
PROGRAM-ID. TESTBTCH. AUTHOR. E.xxxxx (EYJ). DATE-WRITTEN. JANVIER 2013. *TCS COMMENT BEGINS *REMARKS. ****************************************************************** * * * Test d'un programme batch * * * * * ****************************************************************** *TCS COMMENT ENDS EJECT ENVIRONMENT DIVISION. CONFIGURATION SECTION. *SOURCE-COMPUTER. IBM-390. SOURCE-COMPUTER. IBM-370 WITH DEBUGGING MODE. OBJECT-COMPUTER. PROGRAM COLLATING SEQUENCE EBC. SPECIAL-NAMES. ALPHABET EBC IS EBCDIC. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FICDAT ASSIGN FICDAT ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS F-KEY1. DATA DIVISION. FILE SECTION. FD FICDAT. 01 FICDAT-REC. 10 FICDAT-PROGRAM PIC X(08). 10 FILLER PIC X. 10 FICDAT-DATE-TRT PIC X(08). 10 FILLER PIC X(63). * EJECT WORKING-STORAGE SECTION. 77 CMS-IDENTIFICATION PIC X(8) VALUE 'TESTBTCH'. 77 CMS-ID-VALUE PIC X(44) VALUE 'CMS-ID=11Mar2014 09:58:43/dev04p/eyj/V0'. *----------------------------------------------------------------- * ZONES DE TRAVAIL INDEPENDANTES *----------------------------------------------------------------- 77 WS-SORT-RETURN PIC S9(4) COMP. *----------------------------------------------------------------- * ZONES DE TRAVAIL STRUCTUREES *----------------------------------------------------------------- 77 F-KEY1 PIC X(2). 01 INDICES. 05 I1 PIC 9(3) COMP VALUE ZERO. * 01 COMPTEURS. 05 WS-NB-LUS PIC 9(9) COMP-3 VALUE ZEROES. 05 WS-AFF-CPT PIC ZZZBZZZBZZ9. * 01 SWITCHES. 05 SW-END-CURSEUR PIC X VALUE 'N'. 88 END-CURSEUR VALUE 'Y'. 05 SW-END-OF-CLIENT PIC X VALUE 'N'. 88 END-OF-CLIENT VALUE 'Y'. * 01 ZONES-A. 05 ZONE-A PIC X(2). 05 ZONE-B PIC 9. 01 ZONE-AA PIC XX. 01 ZONES-DE-MEMORISATION. 05 SV2-NBR-CO PIC 9(3) COMP-3 VALUE ZERO. * *----------------------------------------------------------------- * ZONES DE COMMUNICATION AVEC LES MODULES *----------------------------------------------------------------- * *----------------------------------------------------------------* * ZONES D'ACCES A LA BASE DE DONNEES 3 *----------------------------------------------------------------* 01 FILLER PIC X(100) VALUE SPACE. EJECT *----------------------------------------------------------------* * ZONES DE COMMUNICATION MODULES 3 *----------------------------------------------------------------* 01 FILLER PIC X(17) VALUE 'TESTBTCH W-S ENDS'. PROCEDURE DIVISION. *---------------------------------------------------------------* * MAINLINE * *---------------------------------------------------------------* 1000-MAIN-LINE. DISPLAY '--------------- TESTBTCH ----------------------' move 'AB0' to zones-a display 'Zones-a = ' Zones-a move zones-a to zone-aa display 'Zone-aa = ' zone-aa STOP RUN . -------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
9 Apr 2014, 08:53
Message
#13
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
Si mes souvenirs du cobol sont exacts (ça fait plus de 25 ans que j'ai pas écrit une ligne de cobol), ENVIRONMENT DIVISION ne se trouvera qu'une seule fois dans un fichier. Tu peux donc simplement utiliser sed pour ça.
Code sed -e '/ENVIRONMENT DIVISION./r fileB' fileA
-------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
9 Apr 2014, 09:02
Message
#14
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 629 Inscrit : 21 Dec 2007 Membre no 103 074 |
tes souvenirs sont très bons.
ton bout te code me convient parfaitement. Un grand merci. -------------------- Machines en ma possession :
- Imac 20", 4,3Ghz, HDD 250, 4Go RAM |
|
|
9 Apr 2014, 09:22
Message
#15
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 964 Inscrit : 3 Nov 2005 Membre no 49 239 |
Si mes souvenirs du cobol sont exacts (ça fait plus de 25 ans que j'ai pas écrit une ligne de cobol), ENVIRONMENT DIVISION ne se trouvera qu'une seule fois dans un fichier. Tu peux donc simplement utiliser sed pour ça. Code sed -e '/ENVIRONMENT DIVISION./r fileB' fileA je vais jouer les chieurs....celà fait 32 ans que j'ai fais du cobol.....il faut vérifier que ENVIRONMENT DIVISION commence bien en colonne 8 (j'espère ne pas faire de boulette) Ce message a été modifié par noop - 9 Apr 2014, 09:22. |
|
|
Nous sommes le : 26th April 2024 - 08:10 |