Extraire un champ d'un fichier

Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention   -  
zipe31 Messages postés 36402 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.
A voir également:

8 réponses

dna.factory Messages postés 26083 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
dna.factory Messages postés 26083 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 433
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 433
 
sed -n '/#\?BEGIN$/,/#\?END$/p' fichier
0
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 433
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 433
 
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
dna.factory Messages postés 26083 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
dna.factory Messages postés 26083 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
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
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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
dna.factory Messages postés 26083 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
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