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 -
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.
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:
- Extraire un champ d'un fichier
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier bin - Guide
- Fichier rar - Guide
- Extraire une video youtube - Guide
8 réponses
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 !
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 !
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...
#?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...
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)
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)
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 !
Cette commande est censée terminer un script que je développe depuis quelques jours. Mais là, je suis totalement bloqué. Misère !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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 ?
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.
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.
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.
......
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.
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 :
ou une vérifiant si la ligne "sc_objet_name" existe bien dans l'intervalle :
J'obtiens le même résultat ;-\
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 ;-\
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
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
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.
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.