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
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
A voir également:
- Extraire un champ d'un fichier
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
- Extraire une video youtube - Guide
8 réponses
dna.factory
Messages postés
25384
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
29 novembre 2024
1 613
Modifié par dna.factory le 28/11/2011 à 10:23
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 !
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 !
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
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...
#?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...
dna.factory
Messages postés
25384
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
29 novembre 2024
1 613
28 nov. 2011 à 10:36
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)
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)
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
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 !
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
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
28 nov. 2011 à 10:42
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 ?
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 ?
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
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.
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.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
28 nov. 2011 à 11:04
28 nov. 2011 à 11:04
sed -n '/#\?BEGIN$/,/#\?END$/p' fichier
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
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.
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.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
28 nov. 2011 à 11:15
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).
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).
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
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.
......
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.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
28 nov. 2011 à 11:27
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 :
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 ;-\
dna.factory
Messages postés
25384
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
29 novembre 2024
1 613
28 nov. 2011 à 11:03
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
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
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
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".
dna.factory
Messages postés
25384
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
29 novembre 2024
1 613
28 nov. 2011 à 11:19
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.
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.
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
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.
En fait, je ne suis pas sur de pouvoir vraiment récupérer toutes les lignes du champs en adoptant ta solution.
dna.factory
Messages postés
25384
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
29 novembre 2024
1 613
28 nov. 2011 à 11:24
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
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