Extraire un champ d'un fichier

Fermé
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - Modifié par BmV le 28/11/2011 à 10:21
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 29 nov. 2011 à 16:20
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 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
Modifié par dna.factory le 28/11/2011 à 10:23
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 10:29
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 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
28 nov. 2011 à 10:36
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 10:38
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 nov. 2011 à 10:42
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 11:01
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 nov. 2011 à 11:04
sed -n '/#\?BEGIN$/,/#\?END$/p' fichier
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 11:10
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 nov. 2011 à 11:15
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 11:21
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 nov. 2011 à 11:27
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 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
28 nov. 2011 à 11:03
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 11:13
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 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
28 nov. 2011 à 11:19
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
28 nov. 2011 à 11:24
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 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
28 nov. 2011 à 11:24
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