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   -
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 ?

7 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Salut,

Avec sed :

sed "s/|/','/g;s/^\|$/'/g" fichier
2
dna.factory Messages postés 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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   Statut Contributeur Dernière intervention   6 430
 
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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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   Statut Contributeur Dernière intervention   6 430
 
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
Utilisateur anonyme
 
salut,

 awk -vguill="'" -F"|" '{for(i=1;i<=NF;i++)printf(guill"%s"guill(i<NF?",":"\n"),$i)}'
0
dna.factory Messages postés 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
merci à vous deux, je regarde ça demain, et je vous tiens au courant.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
\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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
apparement, je ne serais pas en ksh, mais en /bin/sh.
je sais pas si ça change beaucoup.
0
dna.factory Messages postés 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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   Statut Contributeur Dernière intervention   6 430
 
$  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 25993 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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   Statut Contributeur Dernière intervention   6 430
 
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