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
Configuration: Windows XP Internet Explorer 6.0
20 réponses
-
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 ? -
ou utiliser printf
printf("%s;%s;%s\n", $2,$3,$4) -
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 -
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 :
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...
-
faire une boucle
for(n=1;n<20;n++)printf(\"%%s\", $n) -
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 -
une possibilité:
if($3 == "Confirmation de candidature")$12=""
$12 égale rien, on l'annule -
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é -
"{if($3 == \"Confirmation de candidature\")$12=\"\" ; printf(\"%.......
-
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... -
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)
-
est ce que $3 contient ou est exactement égal à "Confirmation de candidature" ?
-
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. -
le == teste l'égalité d'un string
le ~ teste "qui contient" -
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 -
{if($3 ~ \"texte\")...
chez ¨moi, cela fonctionne, si le champ 3 contient texte, le test est vrai -
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