Скрипт Bash обрабатывает CSV-файл построчно, обновляя $ 6 с другим значением, но оставляя другие значения без изменений - PullRequest
0 голосов
/ 17 января 2019

Я новичок в bash-скриптинге и пытаюсь это исправить более 8 часов. Я искал на StackOwerflow и пробовал ответы, чтобы соответствовать моим потребностям, но безуспешно.

Я хочу использовать скрипт bash, чтобы изменить значение даты в CSV-файле на текущую дату.

Я использую фиктивный файл .csv (http://eforexcel.com/wp/wp-content/uploads/2017/07/100-Sales-Records.zip) и хочу изменить шестое значение (дату) на текущую дату.

Что я делал до сих пор: Я создал одну строку CSV для проверки сценария

cat oneline.csv:

Австралия и Океания, Тувалу, Детское питание, офлайн, H, 5/28/2010, 669165933,6 / 27 / 2010,9925,255.28,159.42,2533654.00,1582243.50,951410.50

Затем я протестировал однострочный скрипт:

echo `cat oneline.csv | awk -F, '{ print $1"," $2"," $3"," $4"," $5","}'` `date` `cat oneline.csv |awk -F, '{print $7"," $8"," $9"," $10"," $11"," $12"," $13"," $14"\n"}' 

тогда у меня есть этот код для всех 100 строковых файлов в source.sh:

#I want to change 6th value for every line of source.csv to current date and keep the rest and export it to output.csv
while read  
do
part1=$(`cat source.csv | awk -F, '{ print $1"," $2"," $3"," $4"," $5","}'`)
datum=$(`date`) 
part2=$(`cat source.csv |awk -F, '{print $7"," $8"," $9"," $10"," $11"," $12"," $13"," $14"\n"}'`)
echo `$part1 $datum $part2`
done

и я ожидаю выполнить команду как ./source.sh> output.csv

То, что я хочу для файла из 100 строк, должно иметь следующий результат: Питание, офлайн, Ч, Чт 17 января 06:34:03 EST 2019 , 669165933,6 / 27 / 2010,9925,255.28,159.42,2533654.00,1582243.50,951410.50

Не могли бы вы подсказать, как изменить код для получения результата?

1 Ответ

0 голосов
/ 17 января 2019

Рефакторинг всего в один скрипт Awk; это также позволяет избежать эха в обратных чертах .

awk -v datum="$(date)" -F , 'BEGIN { OFS=FS }
    { $6 = datum } 1' source.csv >output.csv

Вкратце, мы разделяем запятую (-F ,) и заменяем значение шестого поля значением переменной, которую мы передали с -v. OFS=FS устанавливает разделитель поля вывода на разделитель поля ввода (запятая). Тогда 1 означает «печатать безоговорочно».

Вообще говоря, вам, вероятно, следует избегать while read.

Тангенциально, ваша цитата выглядит странно; вам не нужны обратные пометки вокруг $part1, если только это не команда, которую вы хотите, чтобы оболочка запускалась (что, в свою очередь, вероятно, является плохой идеей само по себе). Кроме того, обратные пометки уже давно устарели в пользу синтаксиса $(command), который более разборчив и предлагает некоторые синтаксические преимущества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...