web-dev-qa-db-fra.com

Ajouter une colonne à la fin du fichier CSV en utilisant 'awk' dans le script BASH

Comment ajouter une colonne à la fin d'un fichier CSV en utilisant une chaîne dans une variable?

input.csv

2012-02-29,01:00:00,Manhattan,New York,234
2012-02-29,01:00:00,Manhattan,New York,843
2012-02-29,01:00:00,Manhattan,New York,472
2012-02-29,01:00:00,Manhattan,New York,516

output.csv

2012-02-29,01:00:00,Manhattan,New York,234,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,843,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,472,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,516,2012-02-29 16:13:00

awk.sh

#!/bin/bash

awk -F"," '{$6="2012-02-29 16:13:00" OFS $6; print}' input.csv > output.csv

Ma tentative ci-dessus dans awk.sh a ajouté la chaîne à la fin mais a supprimé tous les séparateurs de virgules.

résultat awk.sh

2012-02-29 01:00:00 Manhattan New York 234 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 843 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 472 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 516 2012-02-29 16:13:00

Appréciez toute aide!

Mise à jour de awk.sh

#!/bin/bash

GAWK="/bin/gawk"
TIMESTAMP=$(date +"%F %T")
ORIG_FILE="input.csv"
NEW_FILE="output.csv"

#Append 'Create' DateTimeStamp to CSV for MySQL logging
$GAWK -v d="$TIMESTAMP" -F"," 'BEGIN {OFS = ","} {$6=d; print}' $ORIG_FILE > $NEW_FILE
rm -f $ORIG_FILE
18
SirOracle

Vous pouvez ajouter une virgule à OFS (Séparateur de champ de sortie):

awk -F"," 'BEGIN { OFS = "," } {$6="2012-02-29 16:13:00"; print}' input.csv > output.csv

Production:

2012-02-29,01:00:00,Manhatten,New York,234,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,843,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,472,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,516,2012-02-29 16:13:00

ÉDITEZ pour répondre au commentaire de SirOracle:

Depuis la page de manuel de awk:

       -v var=val
       --assign var=val
              Assign the value val to the variable var, before execution of the program begins.  Such 
              variable values are available to the BEGIN block of an AWK program.

Assignez donc votre date à une variable Shell et utilisez-la dans awk:

mydate=$(date)
awk -v d="$mydate" -F"," 'BEGIN { OFS = "," } {$6=d; print}' input.csv > output.csv
21
Birei

Je ferais:

awk '{ printf("%s,2012-02-29 16:13:00\n", $0); }' input.csv > output.csv

Ce code dur code la valeur, mais votre code aussi.

Ou vous pouvez utiliser sed:

sed 's/$/,2012-02-29 16:13:00/' input.csv > output.csv
11
Jonathan Leffler

Vous pouvez définir l'ODS (séparateur de champ de sortie):

awk -F"," 'BEGIN { OFS = "," } ; {$6="2012-02-29 16:13:00" OFS $6; print}' input.csv >output.csv

ce qui me donne:

2012-02-29,01:00:00,Manhatten,New York,234,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,843,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,472,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,516,2012-02-29 16:13:00,
4
Jörg Beyer

Si quelqu'un veut créer un fichier csv via Shell avec des noms de colonnes: où la première entrée est stockée dans les variables from_time, to_time.

exemple: insérez deux horodatages avec from_time et to_time comme noms de colonnes avec des valeurs respectives -

CODE-

FROM_TIME=2020-02-06T00:00:00
TO_TIME=2020-02-07T00:00:00
{ echo -e "$FROM_TIME,$TO_TIME";}>input1.csv
{ echo -e "from_time,to_time"; cat input1.csv;} > input.csv

première ligne stockant les valeurs deuxième ligne chargée d'ajouter le nom de la colonne

0
Rudra Mishra