Не могли бы вы попробовать сначала? (Не сохраняя вывод в самом 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