Добавить столбец в конец файла CSV с помощью awk в сценарии BASH

Как добавить столбец в конец файла CSV с использованием строки в переменной?

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

Моя попытка выше в awk.sh добавила строку в конец, но удалила все разделители запятых.

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

Ценю любую помощь!

Обновлен 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

person SirOracle    schedule 29.02.2012    source источник
comment
Разве это не «Манхэттен», а не «Манхэттен»?   -  person Jonathan Leffler    schedule 01.03.2012
comment
Наверное, я просто быстро набирал для примера.   -  person SirOracle    schedule 01.03.2012


Ответы (4)


Вы можете добавить запятую к OFS (разделитель выходных полей):

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

Выход:

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

ИЗМЕНИТЬ, чтобы ответить на комментарий SirOracle:

На странице руководства 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.

Поэтому назначьте дату переменной оболочки и используйте ее внутри awk:

mydate=$(date)
awk -v d="$mydate" -F"," 'BEGIN { OFS = "," } {$6=d; print}' input.csv > output.csv
person Birei    schedule 29.02.2012
comment
Спасибо @Birei. Я не был уверен, что такое OFS, но теперь это имеет смысл. Пробовал ваш код, и он сработал. - person SirOracle; 01.03.2012
comment
Вы знаете, как я могу добавить дату с помощью переменной вместо жестко запрограммированной метки времени? Я добавлю свой исправленный код выше, чтобы лучше его увидеть. - person SirOracle; 01.03.2012
comment
@SirOracle: Обновил ответ. - person Birei; 01.03.2012
comment
@Birei, я обнаружил, что ваш код полезен, я упаковал ваш скрипт и загрузил его как плагин #sparrow, чтобы каждый мог его повторно использовать - sparrowhub.org/info/csv-add-column - person Alexey Melezhik; 11.09.2017
comment
@Birei, милый, спасибо. Как можно включить кавычки в строку, которую нужно вставить? Я хотел добавить строку 2.4.0 (включая кавычки) во второй столбец файла .csv, но приведенный ниже код не работает: awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0"\"; print}' test.csv > output.csv - person pkaramol; 04.03.2019
comment
... и следующее работает, но удаляет последнюю точку из моей 2.4.0 строки awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv - person pkaramol; 04.03.2019
comment
@ Можем ли мы также добавить заголовок. У меня есть данные с заголовком. Как я могу справиться с этим. - person avinash; 18.07.2019

I'd do:

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

Это жестко кодирует значение, но и ваш код тоже.

Или вы можете использовать sed:

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

Вы можете установить OFS (разделитель выходных полей):

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

что дает мне:

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,
person Jörg Beyer    schedule 29.02.2012
comment
Спасибо, Йорг Бейер. Я удалил OFS $ 6, используя приведенный ниже пример @Birei, чтобы избавиться от конечной запятой. Я просто пытаюсь понять, как добавить переменную вместо жестко заданной даты. Я обновил вопрос выше примером. - person SirOracle; 01.03.2012

Если кто-то хочет создать файл csv через оболочку с именами столбцов: где первый ввод хранится в переменных from_time, to_time.

пример: вставить две метки времени с from_time и to_time в качестве имен столбцов с соответствующими значениями -

КОД-

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

первая строка хранит значения вторая строка отвечает за добавление имени столбца

person Rudra Mishra    schedule 14.02.2020
comment
Вам следует отредактировать свой ответ, он непонятный и содержит ошибки (например, вторая echo имеет непревзойденную двойную кавычку) - person tonjo; 14.02.2020