IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Unix : script pour ajouter des lignes
Options
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
yponomeute
posté 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
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
yponomeute
posté 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
Go to the top of the page
 
+Quote Post
noop
posté 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.
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
noop
posté 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
Go to the top of the page
 
+Quote Post
yponomeute
posté 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



Citation (Eddoul @ 9 Apr 2014, 07:59) *
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 wink.gif


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
noop
posté 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
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
yponomeute
posté 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
Go to the top of the page
 
+Quote Post
Eddoul
posté 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
Go to the top of the page
 
+Quote Post
noop
posté 9 Apr 2014, 09:22
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



Citation (yponomeute @ 9 Apr 2014, 09:53) *
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


tongue.gif 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 26th April 2024 - 08:10