Awk : faire une action sur tous les champs
Résolu
dna.factory
Messages postés
25993
Date d'inscription
Statut
Modérateur
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,
Voila mon problème,
je me retrouve avec une extraction d'une table de la base de donnée qui comprends une vingtaine de champs.
le séparateur est le pipe.
Je voudrais utiliser awk (ou une autre commande, je suis sous ksh) afin de générer la commande d'insertion de table (séparateur virgule, et champs entre apostrophes') correspondante à mon résultat (sous ingres, mais pour l'instant on en est pas là)
en gros
en entrée
aaaaaaaa|bbb bbbbb|cccc cccc|dd.dd... (sur 20 champs)
en sortie
'aaaaaaaa','bbb bbbbb','cccc cccc','dd.dd'...
j'ai essayé avec
mais le problème c'est que le résultat comporte un champ par ligne
'aaaaaaa',
'bbb bbbbb',
'cccc cccc',
alors oui, je pourrais me palucher les champs 1 par 1 (en fait, si j'avais commencé par là, ce serait déja fait), mais au dela du temps gagner, c'est l'aspect visuel de la commande obtenue qui me chiffone (et puis tant qu'a faire, autant que je puisse la réutiliser pour une autre table).
Est-ce que quelqu'un a une idée ?
Voila mon problème,
je me retrouve avec une extraction d'une table de la base de donnée qui comprends une vingtaine de champs.
le séparateur est le pipe.
Je voudrais utiliser awk (ou une autre commande, je suis sous ksh) afin de générer la commande d'insertion de table (séparateur virgule, et champs entre apostrophes') correspondante à mon résultat (sous ingres, mais pour l'instant on en est pas là)
en gros
en entrée
aaaaaaaa|bbb bbbbb|cccc cccc|dd.dd... (sur 20 champs)
en sortie
'aaaaaaaa','bbb bbbbb','cccc cccc','dd.dd'...
j'ai essayé avec
awk -v guil="'" -F"|" '{for(i=1;i<=NF;i++) print guil $i guil}'
mais le problème c'est que le résultat comporte un champ par ligne
'aaaaaaa',
'bbb bbbbb',
'cccc cccc',
alors oui, je pourrais me palucher les champs 1 par 1 (en fait, si j'avais commencé par là, ce serait déja fait), mais au dela du temps gagner, c'est l'aspect visuel de la commande obtenue qui me chiffone (et puis tant qu'a faire, autant que je puisse la réutiliser pour une autre table).
Est-ce que quelqu'un a une idée ?
A voir également:
- Awk : faire une action sur tous les champs
- Awk dédoublonner un print ✓ - Forum Shell
- Suppression de lignes en awk ✓ - Forum Shell
- Awk : tri selon la date ✓ - Forum Shell
- SED ou Awk sous windows ?? - Forum Windows
- Awk : remplacement d'un élément conditionnel - Forum Shell
7 réponses
hello
$ awk '{g="\x27"; gsub("[|]", g "," g); print g $0 g}' fichier 'aaaaaaaa','bbb bbbbb','cccc cccc','dd.dd' $
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
forcément, ça aurait été trop simple...
l'export est au format string, et il faut que je le réimporte aux formats num ou money...là ou je vais devoir m'amuser, c'est quand dans certains cas, faudra que je supprimer les espace, mais dans d'autre pas ^^
je vous tiendrais au courant, au moins j'ai appris un peu sur sed
l'export est au format string, et il faut que je le réimporte aux formats num ou money...là ou je vais devoir m'amuser, c'est quand dans certains cas, faudra que je supprimer les espace, mais dans d'autre pas ^^
je vous tiendrais au courant, au moins j'ai appris un peu sur sed
aller encore une petite question sur sed.
Encore une fois, il s'agit d'optimisation graphique du code.
on part de la commande principale.
je rappelle pour ceux qui prennent le train, si y'a un pipe, je le remplace par ','
(la chaine de remplacement est pas importante.)
maintenant, je veux aussi remplacer les valeurs espace pipe et pipe espace.
alors oui, je peux faire trois commandes empilées
mais y'aurait pas moyen de mettre du 'ou' dans la chaine d'origine pour fusionner ces trois commandes ?
Merci
Stop failing the turing test !
Encore une fois, il s'agit d'optimisation graphique du code.
on part de la commande principale.
s/|/','/g
je rappelle pour ceux qui prennent le train, si y'a un pipe, je le remplace par ','
(la chaine de remplacement est pas importante.)
maintenant, je veux aussi remplacer les valeurs espace pipe et pipe espace.
alors oui, je peux faire trois commandes empilées
s/| /','/g;s/ |/','/g;s/|/','/g
mais y'aurait pas moyen de mettre du 'ou' dans la chaine d'origine pour fusionner ces trois commandes ?
Merci
Stop failing the turing test !
tu remplace les | par des ',' (pourquoi je n'y ai pas pensé tout seul... j'avais bien pensé à utiliser s sou vi pour remplacer tous les | par des , ) et je suppose que la deuxième partie c'est pour rajouter une apostrophe au début et à la fin (ça au pire, je saurais le faire en awk).
en gros... tu viens de me dire (sans en être conscient) que je savais faire, c'est juste que je n'avais pas assez réfléchis :)
Par des " ',' " (quote simple, virgule, quote simple) pour être exact ;-))
et je suppose que la deuxième partie c'est pour rajouter une apostrophe au début et à la fin (ça au pire, je saurais le faire en awk).
Exact ;-)
en gros... tu viens de me dire (sans en être conscient) que je savais faire, c'est juste que je n'avais pas assez réfléchis :)
C'est ce qui nous arrive souvent à tous (chercher midi à quatorze heures), et un oeil extérieur est bien souvent bénéfique.
non seulement tu peux chercher midi à 14heures, mais tu peux aussi le chercher à 15, 16 17 ou 11 heures.
y'a toujours 50 façons de faire ce que tu veux faire, et en général on s'arrange toujours pour trouver la plus alambiquée
(et je parle même pas de réinventer le fil à couper l'eau tiède...)
Merci, tiens voila une étoile : http://www.les24heures.org/participants/etoile.png
Disons que pour tout ce qui est travail sur des champs awk est quand même le plus adapté, par contre en matière de substitution, sed s'impose bien souvent ;-))