Команда Unix для замены первого столбца файла .csv - PullRequest
0 голосов
/ 08 марта 2019

Мне нужна команда unix (которую я буду вызывать в задании ControlM), которая изменяет значение первого столбца моего файла .csv (не строки заголовка) на дату предыдущего дня (ожидаемый формат: YYYY-MM-DD).

Я пробовал много команд, но ни одна из них не хочет, чтобы я хотел:

tmp=$(mktemp) && awk -F\| -v val=`date -d yesterday +%F` 'NR>1 {gsub($1,val)}' file.csv > "$tmp" && mv "$tmp" file.csv

или:

awk -F\| -v val=`date -d yesterday +%F` '{gsub($1, val)}1' file.csv

даже попробовал gensub, но не работает.

Пример того, что я хочу: Ввод:

VALUE_DATE;TRADE_DATE;DESCR1;DESCR2
2019-03-05;2017-11-15;BRIDGE;HELLO
2019-03-05;2018-03-17;WORK;DATA

Вывод я хочу (как сегодня 2019-03-07):

VALUE_DATE;TRADE_DATE;DESCR1;DESCR2
2019-03-06;2017-11-15;BRIDGE;HELLO
2019-03-06;2018-03-17;WORK;DATA

Можете ли вы помочь, пожалуйста, и приведите примеры команд, которые должны работать, я не нахожу решение.

Большое спасибо

1 Ответ

0 голосов
/ 08 марта 2019

Не могли бы вы попробовать сначала? (Не сохраняя вывод в самом file.csv), он напечатает вывод на терминале, как только будет счастлив, тогда вы можете использовать ответ предоставлено в конце этого сообщения)

awk -v val=$(date -d yesterday +%F) 'BEGIN{FS=OFS=";"}FNR>1{$1=val} 1' file.csv

Проблемы, определенные в коде OP (и исправленные в моем предложении):

1 - Использование backtick теперь не рекомендуется для сохранения значений переменной оболочки, поэтому вместо этого используйте val=$(date....) для объявления переменной awk с именем val.

2 - Использование -F, вы установили разделитель полей как \|, который является конвейером, но когда мы внимательно рассмотрим предоставленный вами образец Input_file, он будет ограничен ; (точка с запятой) NOT |, чтобы также является одной из причин, по которой это не отражается на результатах.

3 - Поскольку использование gsub($1,val), заменяет всю строку только на значение переменной val так как синтаксис gsub выглядит примерно так: gsub(your_regex/value_needs_to_be_replaced,"new_value"/variable_which_should_be_there_after_replacement,current_line/variable). Так как вы определили неверный разделитель полей, вся строка обрабатывается как $1 и, таким образом, когда вы печатаете его с помощью awk -F\| -v val=$(date -d yesterday +%F) 'NR>1 {gsub($1,val)} 1' file.csv, он будет печатать только предыдущие даты.

4- и главная проблема - вы НЕ печатали ничего, поэтому даже если вы допустили ошибки, вы НЕ увидите вывод на терминале или в выходном файле.



Если вас устраивает, вы можете запустить собственную команду для внесения изменений в сам файл Input_file (я предполагаю, что у вас есть правильное значение в переменной tmp здесь)

tmp=$(mktemp) && awk -v val=$(date -d yesterday +%F) 'BEGIN{FS=OFS=";"}FNR>1{$1=val} 1' file.csv > "$tmp" && mv "$tmp" file.csv
...