Awk : faire une action sur tous les champs

Résolu/Fermé
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 - 9 août 2012 à 16:55
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 10 août 2012 à 14:19
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
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:

7 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
9 août 2012 à 17:27
Salut,

Avec sed :

sed "s/|/','/g;s/^\|$/'/g" fichier
2
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
9 août 2012 à 18:59
alors si j'ai bien compris (je tatonne encore avec sed)
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 :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
9 août 2012 à 19:17
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 , )

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.
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
9 août 2012 à 21:18
c'est ce que j'adore avec le (k)sh...
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...)
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 09:26
j'aurais préféré le awk (parce que je connais mieux), mais le résultat est là.
Merci, tiens voila une étoile : http://www.les24heures.org/participants/etoile.png
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 août 2012 à 09:29
Merci. Mais la solution de dubcek me parait bien adaptée à ton cas non ?

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 ;-))
0
salut,

 awk -vguill="'" -F"|" '{for(i=1;i<=NF;i++)printf(guill"%s"guill(i<NF?",":"\n"),$i)}'
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 09:32
je comprends la méthode, mais apparement, le printf gère les variables awk différement du print car j'ai un
"awk: calling undefined function guill"
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
9 août 2012 à 18:55
merci à vous deux, je regarde ça demain, et je vous tiens au courant.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 août 2012 à 08:30
hello
$ awk '{g="\x27"; gsub("[|]", g "," g); print g $0 g}' fichier
'aaaaaaaa','bbb bbbbb','cccc cccc','dd.dd'
$ 
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 08:40
je vois l'idée, mais je dois me gourrer au \x27
en tapant les 4 caractères, ça m'affiche x27 au lieu de m'afficher l'apostrophe (ksh, TERM=ansi)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 10/08/2012 à 09:01
\x27 c'est ' (quote), pour éviter les multiples \'
ksh ~ $ print -f "\x27\n" 
' 
ksh ~ $   
0

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

Posez votre question
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 10:22
apparement, je ne serais pas en ksh, mais en /bin/sh.
je sais pas si ça change beaucoup.
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 11:33
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
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
Modifié par dna.factory le 10/08/2012 à 13:08
aller encore une petite question sur sed.
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 !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 août 2012 à 13:07
$  echo $A
|aaaaaaa|bbb bbbbb |cccc cccc| dd.d|

$ echo $A | sed "s/^.\|.$/'/g;s/ *| */','/g"
'aaaaaaa','bbb bbbbb','cccc cccc','dd.d'

$
0
dna.factory Messages postés 24947 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 23 avril 2024 1 609
10 août 2012 à 14:15
ha le particularisme de l'étoile dans les regex. Je m'y suis pas encore fait.

en fait, c'est encore mieux que ce que je voulais, parce que coup, même si y'a plusieurs espaces, ça marche aussi..
plus besoin d'utiliser le tr -s du coup.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 août 2012 à 14:19
en fait, c'est encore mieux que ce que je voulais, parce que coup, même si y'a plusieurs espaces, ça marche aussi..
Ben vi, l'astérisque matchant zéro, une ou plusieurs occurrences du caractère précédent ;-))
0