用于替换 .csv 文件第一列的 Unix 命令

Unix command to replace first column of a .csv file

我想要一个 unix 命令(我将在 ControlM 作业中调用)来更改我的 .csv 文件第一列(不是 header 行)的值,以及上一个日期天(预期格式:YYYY-MM-DD)。

我尝试了很多命令,但 none 确实需要我想要的命令:

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

或:

awk -F\| -v val=`date -d yesterday +%F` '{gsub(, 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

你能帮忙并给我一些应该工作的命令示例吗,我找不到解决方案。

非常感谢

您能先尝试以下操作吗?(不将输出保存到 file.csv 本身,一旦满意,它就会在终端上打印输出,然后您可以使用答案 最后提供 post)

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

OP 代码中发现的问题(并在我的建议中修复):

1- 现在不推荐使用反引号来保存 shell 变量的值,因此使用 val=$(date....) 来声明名为 val.

的 awk 变量

2- 使用 -F,您已将字段分隔符设置为 \|,这是管道,但是当我们仔细查看您提供的示例 Input_file 时,它被 [=17 分隔=](分号)不是 | 所以这也是它没有反映在输出中的原因之一。

3- 由于使用 gsub(,val),将整行替换为仅使用变量 val 的值 因为 gsub 的语法类似于:gsub(your_regex/value_needs_to_be_replaced,"new_value"/variable_which_should_be_there_after_replacement,current_line/variable)。由于您定义了错误的字段分隔符,因此整行被视为 </code> 因此当您通过 <code>awk -F\| -v val=$(date -d yesterday +%F) 'NR>1 {gsub(,val)} 1' file.csv 打印它时,它只会打印以前的日期。

4- 第 4 个主要问题是你没有打印任何东西,所以即使你犯了错误,你也不会在终端或输出文件中看到任何输出。



如果您满意,那么您可以 运行 您自己的命令来对 Input_file 本身进行更改。(我假设您在此处的 tmp 变量中具有适当的值)

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