用于替换 .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
我想要一个 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
.
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