Extraire un champ d'un fichier

Ka-El Messages postés 279 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai un fichier qui possède plusieurs champs commençant par "#?BEGIN" et finissant par "#?END".
Ce champs compte une vingtaine de ligne.
Dans ces différents champs, j'ai une information qui revient régulièrement et qui se présente sous cette forme : sc_objet_name=toto
En s'appuyant sur cette information, j'aurais besoin de récupérer l'intégrité du champs associé.
Je suis sur un système linux et pour l'instant je n'ai pas encore réussit à trouver comment procéder pour récupérer ces informations.
J'en appelle donc à votre aide.

Voici un exemple du fichier qui doit faire l'objet de l'extraction (pour plus de clarté):
a_sentinel_transfer_filter='UNDEFINED'
a_attach_extract_file='U'
a_generate_xfb_subject='U'
#?END_APPLI
#?BEGIN
sc_objet_name='00SUCNAP'
a_group='GDEFAULT'
a_direction_allowed='I'
a_comments='RAS'
a_rec_len='32768'
a_data_code='B'
a_x_file_org='S'
a_x_rec_fmt='V'
a_x_rec_len='32768'
a_x_data_code='A'
a_padding='00'
a_truncating_allowed='N'
a_file_dispo='undefined'
a_file_action='undefined'
a_check_records='N'
a_block_size='4096'
a_sys_dep=''
a_text_file='N'
a_dir_path='/depot1/pesit/prod/toto'
a_file_component='&(x_appli).&(x_xfer_ident)_&(x_local_ident)'
#?END
#?BEGIN_APPLI
sc_objet_name='00SUCNAT'
a_group='GDEFAULT'

Merci d'avance pour votre aide.

8 réponses

  1. dna.factory Messages postés 19911 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    cat 'fichier' |grep sc_objet_name |awk -F"=" '{print $2}'

    avec le fichier que tu as donné, tu auras en résultat :
    '00SUCNAP'
    '00SUCNAT'

    tu peux faire sauter les ' avec un deuxieme awk : awk -F"'" '{print $2}'
    (après le -F c'est guilllemets(touche3) - apostrophe simple(touche4) - guillemets - espace - apostrophe simple - accolade ouvrante)

    Stop failing the turing test !
    0
  2. Ka-El Messages postés 279 Statut Membre
     
    Merci pour ta réponse dna.factory, mais en fait il faut que la commande me donne le résultat suivant :

    #?BEGIN
    sc_objet_name='00SUCNAP'
    a_group='GDEFAULT'
    a_direction_allowed='I'
    a_comments='RAS'
    a_rec_len='32768'
    a_data_code='B'
    a_x_file_org='S'
    a_x_rec_fmt='V'
    a_x_rec_len='32768'
    a_x_data_code='A'
    a_padding='00'
    a_truncating_allowed='N'
    a_file_dispo='undefined'
    a_file_action='undefined'
    a_check_records='N'
    a_block_size='4096'
    a_sys_dep=''
    a_text_file='N'
    a_dir_path='/depot1/pesit/prod/toto'
    a_file_component='&(x_appli).&(x_xfer_ident)_&(x_local_ident)'
    #?END

    C'est donc le champs à partir de "#?BEGIN" jusqu'à "#?END" que je dois récupérer...
    0
  3. dna.factory Messages postés 19911 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    ah oui, tout de suite plus intéressant...
    je reste persuadé que le salut viendra de awk ou de sed

    je regarde de mon coté (ça m'intéressera aussi de toute façon)

    juste pour être sur : c'est bien de la prod (tout les coups sont permis) et pas un exercice scolaire avec une contrainte d'execution ?

    (je pense entre autre aux fichiers temporaires)
    0
  4. Ka-El Messages postés 279 Statut Membre
     
    Oui c'est bien de la production.
    Cette commande est censée terminer un script que je développe depuis quelques jours. Mais là, je suis totalement bloqué. Misère !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Pour résumer...

    Tu ne dois récupérer l'intervalle "#?BEGIN => #?END" que si celui-ci contient bien une ligne "sc_objet_name='xxxx'", c'est ça ?

    0
  7. Ka-El Messages postés 279 Statut Membre
     
    Salut Zipe31,
    Oui car chaque champs "#?BEGIN => #?END" comporte systématiquement l'information "sc_objet_name='xxxx'".
    Par ailleurs, l'extraction du champs doit se faire à partir de cette données (par un grep où autres...)
    Merci.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      sed -n '/#\?BEGIN$/,/#\?END$/p' fichier
      0
    2. Ka-El Messages postés 279 Statut Membre
       
      Je pense qu'il y a un début d'idée, mais avec cette commande je récupère le fichier entier (qui concatène une suite de champs "#?BEGIN => #?END").
      C'est pour cela qu'il est important de filtrer le champs via l'information "sc_objet_name='xxxx'" pour obtenir le champs le concernant directement.
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Je ne comprends plus rien ;-((

      Il te faut quoi exactement au final ???

      Merci de poster un exemple concret avec ton fichier AVANT (le plus explicite possible) et la sortie que tu veux APRÈS (le résultat final).
      0
    4. Ka-El Messages postés 279 Statut Membre
       
      Voici un extrait du fichier original (la capture ci-dessous a été extraite en plein milieu du fichier):

      ......
      a_sentinel_transfer_filter='UNDEFINED'
      a_attach_extract_file='U'
      a_generate_xfb_subject='U'
      #?END_APPLI
      #?BEGIN
      sc_objet_name='00SUCNAP'
      a_group='GDEFAULT'
      a_direction_allowed='I'
      a_comments='RAS'
      a_rec_len='32768'
      a_data_code='B'
      a_x_file_org='S'
      a_x_rec_fmt='V'
      a_x_rec_len='32768'
      a_x_data_code='A'
      a_padding='00'
      a_truncating_allowed='N'
      a_file_dispo='undefined'
      a_file_action='undefined'
      a_check_records='N'
      a_block_size='4096'
      a_sys_dep=''
      a_text_file='N'
      a_dir_path='/depot1/pesit/prod/toto'
      a_file_component='&(x_appli).&(x_xfer_ident)_&(x_local_ident)'
      #?END
      #?BEGIN_APPLI
      sc_objet_name='00SUCNAT'
      a_group='GDEFAULT'
      etc.....


      Maintenant si je me fixe sur l'information '00SUCNAP' qui se trouve devant "sc_objet_name=", je dois obtenir au final, le résultat suivant :

      #?BEGIN
      sc_objet_name='00SUCNAP'
      a_group='GDEFAULT'
      a_direction_allowed='I'
      a_comments='RAS'
      a_rec_len='32768'
      a_data_code='B'
      a_x_file_org='S'
      a_x_rec_fmt='V'
      a_x_rec_len='32768'
      a_x_data_code='A'
      a_padding='00'
      a_truncating_allowed='N'
      a_file_dispo='undefined'
      a_file_action='undefined'
      a_check_records='N'
      a_block_size='4096'
      a_sys_dep=''
      a_text_file='N'
      a_dir_path='/depot1/pesit/prod/toto'
      a_file_component='&(x_appli).&(x_xfer_ident)_&(x_local_ident)'
      #?END

      Est-ce que ça te parait plus clair ?
      Merci en tout cas pour ton aide.
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Oui et non ;-\

      Non parce que la commande que je t'ai donnée précédemment fait ce que tu demandes ;-\

      Non parce que tu ne donnes qu'un exemple où se trouve qu'UN seul exemple d'intervalle "BEGIN => END" ;-(

      Pour te montrer ma bonne foi :
      Que je lance ma commande précédente :
      sed -n '/#\?BEGIN$/,/#\?END$/p' fichier

      ou une vérifiant si la ligne "sc_objet_name" existe bien dans l'intervalle :
      sed -n '/#\?BEGIN$/{:z;N;/#\?END$/! bz;/sc_objet_name/p}' fichier

      J'obtiens le même résultat ;-\
      0
  8. dna.factory Messages postés 19911 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    une première idée :
    extraire systématiquement les chaines de begin à end dans un fichier temporaire,
    une fois que c'est fait tester le fichier temporaire, et si y'a pas l'info, le rejeter et continuer....
    pas besoin de awk ou de sed, mais beaucoup de boucles imbriquées et probablement des breaks/exits
    0
    1. Ka-El Messages postés 279 Statut Membre
       
      L'info recherchée sera toujours présente, puisque mon script se lance à la condition que l'info est bien constatée dans la suite de champs "#?BEGIN => #?END".
      0
  9. dna.factory Messages postés 19911 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    une méthode très sale...
    je suis même pas sur que ça marche

    tu définis une variable fichier=/dev/null

    tu boucle sur toutes les lignes de ton fichier
    et dans cette boucle tu fais

    si la ligne contiens begin, alors fichier= ton fichier
    si la ligne contiens end, alors fichier = /dev/null
    dans tous les cas, tu envoie la ligne dans $fichier

    et le pire...
    même pas honte.
    0
    1. Ka-El Messages postés 279 Statut Membre
       
      Je te l'accorde, c'est sale ! :)
      En fait, je ne suis pas sur de pouvoir vraiment récupérer toutes les lignes du champs en adoptant ta solution.
      0
    2. dna.factory Messages postés 19911 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      c'est sur qu'avec
      sed -n '/#\?BEGIN$/,/#\?END$/p' fichier
      tout de suite, ça fait plus propre

      faut vraiment que je mettes à sed, mais bon, j'essaye déja de maitriser awk
      0