Gawk.exe : insertion d'espace entre champs

Fermé
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 18 juin 2008 à 10:32
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 2 juil. 2008 à 09:31
Salut,

le but est de n'imprimer que certains champs (colonnes) d'un tableau csv : ici les colonnes 2,3 et 4. Pour cela j'utilise gawk.exe avec la commande suivante :

cat EvalDossier.csv | gawk -F";" "{print $2 $3 $4}" >> 1.txt


ça fonctionne très bien sauf que les champs $2, $3 et $4 sont collés, j'aimerais beaucoup insérer un espace entre chaque champ, voire encore mieux un ; histoire de pouvoir réimporter ce fichier dans excel.
Quelques essais :

cat EvalDossier.csv | gawk -F";" "{print $2 " " $3 " " $4 " "}" >> 1.txt
cat EvalDossier.csv | gawk -F";" "{print $2 "[:space:]" $3 "[:space:]" $4 "[:space:]"}" >> 1.txt
cat EvalDossier.csv | gawk -F";" "{print $2" " $3" " $4" "}" >> 1.txt
...


n'ont pas abouti, quelqu'un aurait une idée lumineuse, svp ?

Merci

PS : attention ça se passe bien sous windows, avec les outils unixutils

20 réponses

eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
18 juin 2008 à 11:03
Bon, pour l'insertion d'un espace il suffit d'ajouter une virgule entre chaque champ

cat EvalDossier.csv | gawk -F";" "{print $2,$3,$4}" >> 1.txt


en revanche comment insérer un caractère précis tel que le ; ? j'imagine que c'est possible avec sed mais la comande risque d'être interminable...
ou comment à la limite ne pas supprimer le séparateur FS défini lors de l'impression ?
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
18 juin 2008 à 12:40
ou utiliser printf
printf("%s;%s;%s\n", $2,$3,$4)
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
18 juin 2008 à 13:34
Merci. Par contre la commande entière tu l'écrirais comment ? car les quelques essais engagés ne donnent rien...
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
18 juin 2008 à 13:40
gawk sous windows, il faut " et donc protéger ceux du printf
cat EvalDossier.csv | gawk -F";" "{printf(\"%s;%s;%s\n\", $2,$3,$4)}" >> 1.txt
0

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

Posez votre question
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
18 juin 2008 à 13:51
Ok, je me demandais s'il fallait conserver gawk... En revanche, il faut doubler les % sinon le résultat n'est pas bon :

cat EvalDossier.csv | gawk -F";" "{printf(\"%%s;%%s;%%s\n\", $2,$3,$4)}" >> 1.txt


Merci pour ton aide ;)
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
18 juin 2008 à 16:22
Question bête, mais si je souhaite imprimer 20 champs, il faut mettre 20 fois %%s ? j'ai l'impression que oui mais s'il existe une option pour généraliser...
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
18 juin 2008 à 17:19
faire une boucle
for(n=1;n<20;n++)printf(\"%%s\", $n)
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
20 juin 2008 à 09:59
Ok.

J'ai encore un souci de taille. Cette commande sort parfaitement bien les champs demandés. Par contre je souhaiterais supprimer un champ conditionnellement :

si la cellule 3 contient l'expression "Confirmation de candidature", alors supprimer le contenu de la 12ème cellule du tableau (sachant qu'il peut y avoir autre chose dans cette 3ème cellule que "Confirmation de candidature" et qu'il faut laisser dans ce cas).
En d'autres termes, il s'agit de supprimer le contenu de la 9ème cellule suivant la cellule contenant l'expression "Confirmation de candidature".

J'ai testé avec sed quelque chose dans le genre :

sed "s/;Confirmation de candidature;.*;.*;.*;.*;.*;.*;.*;.*;.*;//g"


qui pose un très gros problème puisque le contenu des cellules intermédiaires (entre 3 et 12) est supprimé.

Sed c'est la bonne approche ? ou il faut combiner avec cut, grep ou autre chose ?

Merci encore
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 juin 2008 à 10:22
une possibilité:
if($3 == "Confirmation de candidature")$12=""

$12 égale rien, on l'annule
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
20 juin 2008 à 10:40
le souci c'est comment insérer cette condition dans la commande de départ :

cat EvalDossier.csv | gawk -F";" "{printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\", $2,$3,$13,$14,$15,$7,$8,$9,$10,$11,$12,$16,$17,$18)}" >> 1.csv

PS : finalement je n'ai pas utilisé la boucle for du post 7, c'était juste une question de curiosité
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 juin 2008 à 11:22
"{if($3 == \"Confirmation de candidature\")$12=\"\" ; printf(\"%.......
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
20 juin 2008 à 11:32
pour être certain, c'est bien là :

cat EvalDossier.csv | gawk -F";" "{"{if($3 == \"Confirmation de candidature\")$12=\"\" ; printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\", $2,$3,$13,$14,$15,$7,$8,$9,$10,$11,$12,$16,$17,$18)}" >> 1.csv


?

ça n'a pas l'air de marcher dans cette position...
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 juin 2008 à 12:53
il y a des " en trop
cat EvalDossier.csv | gawk -F";" "{if($3 == \"Confirmation de candidature\")$12=\"\" ; printf(\"%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s;%%s\n\", $2,$3,$13,$14,$15,$7,$8,$9,$10,$11,$12,$16,$17,$18)}" >> 1.csv
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
20 juin 2008 à 15:47
ça n'a pas l'air de fonctionner non plus, les cellules contenant "Confirmation de candidature" et la 9ème cellule qui suit sont laissées telles quelles (non vides)
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 juin 2008 à 15:56
est ce que $3 contient ou est exactement égal à "Confirmation de candidature" ?
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
20 juin 2008 à 17:00
j'avais commencé à regarder justement si les cellules correspondaient bien mais j'ai du basculer sur autre chose, et ne pourrais pas reprendre avant le début de semaine prochaine.

Pour info, j'utilise un logiciel de gestion RH (Relation) qui livre des résultats de requêtes sous forme d'un tableau excel complètement désordonné, ce qu'on est en train de faire est une piste vachement intéressante pour ranger tout ça.

Je te tiendrais au courant dès que possible et te remercie encore une fois.
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
20 juin 2008 à 17:24
le == teste l'égalité d'un string
le ~ teste "qui contient"
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
24 juin 2008 à 15:47
Salut dubcek,

par curiosité j'ai testé "contient" :

cat EvalDossier.csv | gawk -F";" "{if($3~\"Confirmation de candidature\").....

et ça a l'air de bloquer : fermeture quasi immédiate du terminal DOS

Sinon l'idée, c'est que si dans le tableau originel la colonne 13 contient "Confirmation de candidature", alors ne pas afficher son commentaire correspondant qui se trouve dans la colonne 16
j'ai l'impression de mélanger un peu le tableau de départ avec celui de sortie
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
25 juin 2008 à 12:17
{if($3 ~ \"texte\")...
chez ¨moi, cela fonctionne, si le champ 3 contient texte, le test est vrai
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
2 juil. 2008 à 09:31
Hélas, pas chez moi. Ecoute, je me permets de te proposer le fichier originel http://www.cijoint.fr/cjlink.php?file=cj200807/cij9jwP3BJ.xls si tu as un peu de temps pour regarder, car la précédente commande ne fonctionne pas.

Pour rappel, l'objectif premier est de ne pas pas afficher dans le tableau 1.csv - issu de la commande précédente - le contenu de la cellule Mi si celle-ci contient l'expression "Confirmation de candidature". Cette cellule Mi correspond à l'Action1 (titre de la colonne M), et dans l'idéal il faudrait également ne pas afficher le contenu de la cellule "Suivi-Commentaire (Général)1" qui lui correspond dans la cellule Pi

Tout le reste doit être affiché conformément à ce que nous avons fait plus haut :

$2,$3,$13,$14,$15,$7,$8,$9,$10,$11,$12,$16,$17,$18
0