Récupération d'un nombre de lignes entre chaque mot "demande"

Résolu
richy -  
 richy -
Bonjour,
J'ai un fichier nommé "toto" sous UNIX Solaris10, je voudrais extraire la partie qu'il y'a entre les lignes "demande" et l'afficher dans le fichier correspondant exemple : le fichier x contiendra les action de x et ainsi de suite .

fichier toto:
.
.
demande x
action 1......
action 2......
demande y
action 3......
action 4......
action 5......
demande z
action 6.....
action 7......
action 8......
action 9.......
demande t
action 10.....
action 11...
.
.
.
demande n
action n.....

Merci d'avance!
</gras></gras>

5 réponses

Résumé de la discussion

Le problème porte sur l’extraction des blocs d’actions situés entre les occurrences des lignes DEMANDE dans le fichier toto, puis leur écriture dans des fichiers distincts. Une solution sur Solaris consiste à utiliser nawk pour détecter les lignes DEMANDE, fermer le fichier courant, ouvrir un nouveau fichier nommé par le deuxième champ et rediriger les lignes suivantes. Concrètement, on affecte l’étiquette de sortie à une variable f et l’on écrit les lignes dans print > f, tandis que les lignes DEMANDE provoquent le changement de fichier. En parallèle, d’autres méthodes existent, par exemple sed pour enlever les espaces en tête sur les lignes DEMANDE, bien que ce soit moins robuste que l’usage d’un script awk dédié.

Bobot (l'IA à votre service)
  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    L'extraire comment ? Tout d'un coup ?

    Merci de poster un exemple AVANT => APRÈS !
    0
    1. richy
       
      Je voudrais extraire la partie qu'il y'a entre les lignes "demande" et l'afficher dans un autre fichier correspondant exemple : le fichier x contiendra les action de x le fichier y contiendra les action de y et ainsi de suite jusqu'au fichier n contiendras les actions de n.

      cordiales salutations!
      0
    2. richy
       
      avant :
      un seul fichier
      toto:
      demande x
      action 1......
      action 2......
      demande y
      action 3......
      action 4......
      action 5......
      demande z
      action 6.....
      action 7......
      action 8......
      action 9.......
      demande t
      action 10.....
      action 11...
      .
      .
      .
      demande n
      action n.....

      après:
      n fichiers ( x, y, z, t,........n)

      1 - fichier x
      demande x
      action 1......
      action 2......

      2 - fichier y
      demande y
      action 3......
      action 4......
      action 5......
      .
      .
      3 - fichier n
      demande n
      action n

      cordiales salutations
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Ben logiquement la solution donnée par dubcek devrait faire exactement ce que tu demandes, non ?
      0
  2. Gemini
     
    Tu n'as qu'à te coder un joli petit parseur en C ;-)
    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    sur Solaris, utiliser nawk
    $ nawk '/^demande/ {f=$2; next} {print > f}' toto
    $ more ?
    ::::::::::::::
    t
    ::::::::::::::
    action 10.....
    action 11... 
    ::::::::::::::
    x
    ::::::::::::::
    action 1......
    action 2......
    ::::::::::::::
    y
    ::::::::::::::
    action 3......
    action 4......
    action 5......
    ::::::::::::::
    z
    ::::::::::::::
    action 6.....
    action 7......
    action 8......
    action 9.......
    $ 
    
    0
    1. richy
       
      Merci dubcek!
      ta solution marche mais j'ai un soucis:
      la commande nawk ne me récupère pas tout les demandes c'est-à-dire ne parcoure pas le fichier jusqu'à la fin à la énième demande! merci !
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      avec /^demande/ nawk va chercher les lignes qui commencent exactement par demande et prendre le champ 2 comme nom de fichier
      y a-t-il des majuscules, espace ou autre ?
      0
    3. richy
       
      re dubcek
      c'est cette commande que j'ai utilisé: nawk '/^AGENCE/ {f=$2; next} {print > f}' toto ça marche comme je voulait le seul probleme c'est que le nawk ne parcour pas tout le fichier toto jusqu'à la fin c'est à dire que j'ai en sortie:
      fichier x, fichier y, ........... pas la totalité des fichiers manque les fichiers : ... n-2, n-1,n

      cordiales salutation !
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      est-ce que grep '^AGENCE' toto trouve toutes les lignes ?
      0
    5. richy
       
      re dubcek :

      oui j'ai toute les les lignes avec : grep '^demande' toto
      reste à combinner ce grep avec le nawk
      je te laisse le soin de le faire merci!

      cordiales salutation
      0
  4. richy
     
    merci pour la commande dubcek par contre j'ai l'erreur suivante:

    nawk: null file name in print or getline
    enregistrement d'entrée no 1, fichier toto
    numéro de ligne source 1

    cordiales salutations!
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      le champ 2 est vide, affiche les premières lignes du fichier
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      exécuter ça pour voir ce qu'il fait
      nawk '/^demande/ {f=$2; print "creation de: " f; next} {print "\tajout de: " $0; print $0 > f}' toto
      0
    3. richy
       
      Bonjour dubcek:
      tout mes fichier sont dans le répertoire / mnt / incident / :
      / mnt / incident / liste
      / mnt / incident / groupe1.............................................groupe10
      / mnt / incident / 101.........................................................412

      Le travail demandé et de lire toutes les lignes du fichier liste une par une avec une boucle for par example et voir à quel groupe la ligne appartient-elle.
      par example: je lis la première ligne du fichier liste qui est 101, je regarde si 101 appartient au fichier groupe1 oui il appartient au groupe1 alors je copie le contenu du fichier 101 dans un nouveau fichier que je vais nommé incident_groupe1 :

      * contenu du fichier 101 est :
      AGENCE 101
      mardi, 13 novembre 2012, 15:44:15 CET
      => Sauvegarde avant TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      je lis la deuxième ligne du fichier liste qui est 114, je regarde si 114 appartient au fichier groupe1 oui il appartient au groupe1 alors je copie le contenu du fichier 114 dans le fichier incident_groupe1 :

      * contenu du fichier 114 est :
      AGENCE 114
      mardi, 13 novembre 2012, 15:28:46 CET
      => Sauvegarde avant TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      je lis la troisième ligne du fichier liste qui est 117, je regarde si 117 appartient au fichier groupe1 NON, il appartient au groupe2 alors je copie le contenu du fichier 117 dans un nouveau fichier que je vais nommé incident_groupe2 :

      est ainsi de suite pour toutes les ligne lues du fichier liste.

      * contenu du fichier 117 est :
      AGENCE 117
      mardi, 13 novembre 2012, 15:55:16 CET
      => Sauvegarde apres TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      à ce state le fichier le contenu du fichier incident_groupe1 est :

      AGENCE 101
      mardi, 13 novembre 2012, 15:44:15 CET
      => Sauvegarde avant TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 114
      mardi, 13 novembre 2012, 15:28:46 CET
      => Sauvegarde avant TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      .
      .

      à ce state le fichier le contenu du fichier incident_groupe2 est :

      AGENCE 117
      mardi, 13 novembre 2012, 15:55:16 CET
      => Sauvegarde apres TFJ du 13112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      .
      .
      et ainsi de suite.
      Merci cordiales salutations!
      0
    4. richy
       
      bonjour dubcek !
      Je n'arrives pas à ouvrir ce lien!

      cordiales salutations!
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    moi, je veux 1 million de dollars.
    debug avec tes données:
    for F in $(cat liste); do       pour chaque fichier dans liste
    N=$(grep -l $F groupe*);        trouve le fichier groupe qui le contient
    cat $F >> incident_$N; done     ajoute le contenu du fichier à incident_groupe
    
    0
    1. richy
       
      ok en espèce ou par chèque?
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      espèces usagées seulement, No qui ne se suivent pas
      décrit mieux ce qui ne marche pas
      0
    3. richy
       
      bonjour dubcek!
      le programme marche avec la boucle for:
      for F in $(cat liste); do N=$(grep -l $F groupe*) ; cat $F >> incident_$N; done

      il y a juste un petit soucis dans le cas ou j'ai une redondance d'évènements d'une agence avec deux dates différentes
      la commande : nawk '$1 ~ /Agence/ {close(f); f=$2; print f > "liste"; next} {print > f}' toto
      ne prend pas en charge le cas ou il y'a une agence qui a des évènements à deux date différentes dans le fichier toto

      : exemple:
      AGENCE 126
      lundi, 19 novembre 2012, 15:55:33 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 149
      lundi, 19 novembre 2012, 14:50:28 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 155
      lundi, 19 novembre 2012, 15:33:21 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 156
      lundi, 19 novembre 2012, 15:46:48 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 164
      lundi, 19 novembre 2012, 16:45:09 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:49:19 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 165
      lundi, 19 novembre 2012, 16:11:02 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:29:04 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 178
      lundi, 19 novembre 2012, 17:11:27 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 17:51:44 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 179
      lundi, 19 novembre 2012, 15:53:52 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 196
      lundi, 19 novembre 2012, 15:33:08 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 199
      lundi, 19 novembre 2012, 16:31:10 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 215
      dimanche, 18 novembre 2012, 16:17:15 CET
      => Sauvegarde avant TFJ du 18112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      dimanche, 18 novembre 2012, 16:48:51 CET
      => Sauvegarde apres TFJ du 18112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 215
      lundi, 19 novembre 2012, 16:25:02 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:58:20 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 308
      lundi, 19 novembre 2012, 16:19:45 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 322
      lundi, 19 novembre 2012, 15:55:30 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:18:58 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 358
      lundi, 19 novembre 2012, 15:27:30 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 404
      lundi, 19 novembre 2012, 15:57:15 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 422
      lundi, 19 novembre 2012, 16:03:54 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 435
      lundi, 19 novembre 2012, 15:43:22 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      AGENCE 444
      lundi, 19 novembre 2012, 16:32:59 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      en résultat j'ai dans le fichier 215 que le dernier évènement du 19 novembre2012
      fichier 215:
      AGENCE 215
      lundi, 19 novembre 2012, 16:25:02 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:58:20 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      dans le contenu du fichier incident_groupe3 :
      l'évènement du 19 novembre 2012 est dupliqué en double et l'évènement du 18 novembre n'est pas affiché.

      AGENCE 215
      lundi, 19 novembre 2012, 16:25:02 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:58:20 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      AGENCE 215
      lundi, 19 novembre 2012, 16:25:02 CET
      => Sauvegarde avant TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service
      lundi, 19 novembre 2012, 16:58:20 CET
      => Sauvegarde apres TFJ du 19112012 sur DAT non faite
      => DAT ou lecteur de DAT hors service

      je voudrais afficher le tout c-à-d les évènements des deux dates 18 et 19 novembre dans le fichier incident_groupe3

      merci!
      cordiales salutations
      0
    4. prefix
       
      c'est comme le language "basic" d'un thomson to8...c'est vraiment pas compliqué ce que tu demandes....sans "nawk" ca marche aussi....
      0
    5. richy
       
      je vais essayer merci!
      0