J'ai un fichier texte:
ifile.txt
1 4 22.0 3.3 2.3
2 2 34.1 5.4 2.3
3 2 33.0 34.0 2.3
4 12 3.0 43.0 4.4
Je voudrais le convertir en fichier csv:
ofile.txt
ID,No,A,B,C
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4
J'essayais avec ça, mais je n'obtenais pas le résultat.
(echo "ID,No,A,B,C" ; cat ifile.txt) | sed 's/<space>/<comma>/g' > ofile.csv
awk
peut être un peu exagéré ici. À mon humble avis, utiliser tr
pour des substitutions directes comme celle-ci est beaucoup plus simple:
$ cat ifile.txt | tr -s '[:blank:]' ',' > ofile.txt
Seulement sed et rien d'autre
sed 's/ \+/,/g' ifile.txt > ofile.csv
chat ofile.csv
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4
voici la version awkawk 'BEGIN{print "ID,No,A,B,C"}{print $1","$2","$3","$4","$5}' ifile.txt
sortie:
ID,No,A,B,C
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4
Essaye ça ..
tr -s " " < ifile.txt | sed 's/ /,/g' > ofile.txt
SORTIE
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4
Une possibilité, pas nécessairement la meilleure, est:
sed -e '1i\
ID,No,A,B,C' -e 's/[[:space:]]\{1,\}/,/g' ifile.txt
Insérez l'en-tête avant la ligne 1; changez chaque séquence d'un ou plusieurs caractères de l'espace en une virgule. Le saut de ligne est nécessaire en traditionnel (standard POSIX - dans ce cas, BSD ou Mac OS X) sed
; GNU sed
vous permet d'utiliser:
/opt/gnu/bin/sed -e '1i\' -e 'ID,No,A,B,C' -e 's/[[:space:]]\{1,\}/,/g'
Sortie:
ID,No,A,B,C
1,4,22.0,3.3,2.3
2,2,34.1,5.4,2.3
3,2,33.0,34.0,2.3
4,12,3.0,43.0,4.4
Alternativement et plus simplement, demandez à sed
de traiter le fichier et utilisez echo
pour ajouter l'en-tête, comme vous l'avez fait dans les grandes lignes:
{
echo "ID,No,A,B,C"
sed -e 's/[[:space:]]\{1,\}/,/g' ifile.txt
} > ofile.txt
Après examen, c'est probablement ce que j'utiliserais.
Faites-le simplement en utilisant la commande awk.
awk '{
printf("%d, %d, %.1lf, %.1lf,%.1lf\n", $1,$2,$3,$4,$5);
}' input.txt > output.csv