La sortie actuelle que j'ai d'une requête SQL est

database_name   database_size     unallocated_space   reserved      data          index_size    unused
-------------- ------------------ ------------------  ------------- ------------- ------------- ------------- 
 TEST            22200.00 MB            3160.41 MB      9256544 KB    6597072 KB    1559384 KB    1100088 KB

Essayer de créer un csv au format

database_name,database_size,unallocated_space,reserved,data,index_size,unused
Test,22200.00 MB,3160.41 MB,9256544 KB,6597072 KB,1559384 KB,1100088 KB

Sortie que j'obtiens actuellement

database_name,database_size,unallocated_space
Test,22200.00,MB,3160.41,MB,9256544,KB,6597072,KB,1559384,KB,1100088,KB

Avec

echo "database_name,database_size,unallocated_space" > $outfile
awk -F " " '{print $1","$2","$3",$4","$5","$6","$7}' $readFile  >> $outfile

Où readfile est le fichier contenant la sortie de la requête sql et outfile est le csv.

0
JSS 27 août 2020 à 19:00

2 réponses

Meilleure réponse

Vous pouvez utiliser cette awk, la première condition imprime l'en-tête, la seconde imprime les champs avec des nombres et des Mo ensemble.

> awk -v OFS=, 'NR==1{$1=$1;print;next} NF==5{print $1, $2" "$3, $4" "$5}' file
database_name,database_size,unallocated_space
Test,100.00 MB,200 MB

Ou une alternative awk, de @Cyrus (basée sur le nombre d'espaces dans votre entrée).

> awk 'NR!=2{$1=$1; print}' FS='  +' OFS=',' file
database_name,database_size,unallocated_space,
Test,100.00 MB,200 MB

Remarque: dans les deux commandes, $1=$1 est un idiome pour forcer le fractionnement de awk en champs et recalculer la sortie, afin qu'il s'imprime à l'aide du nouveau séparateur de champ.


Modifié pour l'entrée mise à jour:

awk -OFS, 'NR==1{$1=$1;print;next} NF==13{print $1,$2" "$3,...<etc until 12-13> }' file
0
thanasisp 27 août 2020 à 20:01

Ne pouvez-vous pas simplement changer votre requête SQL, quelque chose comme:

Select concat(database_name, ",", database_size, ",", ...) ...

Comme ça, vous n'avez pas besoin de faire de reformatage par la suite.

Attention, j'ai écrit "concat", je ne suis pas sûr du nom correct de la fonction de concaténation.

1
Dominique 27 août 2020 à 16:19