Gawk.exe : insertion d'espace entre champs
eZula
Messages postés
3509
Statut
Contributeur
-
eZula Messages postés 3509 Statut Contributeur -
eZula Messages postés 3509 Statut Contributeur -
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 :
ç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 :
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
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
Bon, pour l'insertion d'un espace il suffit d'ajouter une virgule entre chaque champ
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 ?
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 ?
Merci. Par contre la commande entière tu l'écrirais comment ? car les quelques essais engagés ne donnent rien...
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
cat EvalDossier.csv | gawk -F";" "{printf(\"%s;%s;%s\n\", $2,$3,$4)}" >> 1.txt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ok, je me demandais s'il fallait conserver gawk... En revanche, il faut doubler les % sinon le résultat n'est pas bon :
Merci pour ton aide ;)
cat EvalDossier.csv | gawk -F";" "{printf(\"%%s;%%s;%%s\n\", $2,$3,$4)}" >> 1.txt
Merci pour ton aide ;)
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...
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 :
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
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
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é
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é
pour être certain, c'est bien là :
?
ça n'a pas l'air de marcher dans cette position...
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...
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
ç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)
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.
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.
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
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
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
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