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

用于替换.csv文件第一列的Unix命令,unix,awk,gsub,Unix,Awk,Gsub,我需要一个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 或:

我需要一个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
或:

甚至试过gensub,但没用

我想要的示例: 输入:

我想要的输出(今天是2019-03-07):

你能帮我个忙,给我一些命令的例子吗?我没有找到解决办法


非常感谢

能否请您先尝试以下内容?(不将输出保存到
文件.csv
本身它将在终端上打印输出,然后您可以使用答案 (此职位最后提供)

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

1-现在使用backtick来保存shell变量的值,因此使用
val=$(日期…)
来声明名为
val
的awk变量

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

3-由于使用了
gsub($1,val)
,因此将整行替换为仅使用变量val的值 因为 gsub的语法类似于:
gsub(您的正则表达式/值需要被替换,“新值”/“变量”\u替换后应该在哪里,当前行/变量)
。因为您定义了错误的字段分隔符,所以整行被视为
$1
,因此当您通过执行
awk-F\|-v val=$(date-d date-date date+%F)'NR>1{gsub($1,val)}1'file.csv打印它时,它将只打印以前的日期

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



如果高兴的话,您可以运行自己的命令对输入文件本身进行更改。(我假设您的
tmp
变量中有正确的值)


欢迎来到SO,建议您将示例/代码包装在代码标签中,您可以在编辑帖子时使用{}按钮来完成。感谢jxc为这篇文章所做的工作,但请为以后的帖子做一个注释。这太棒了。非常感谢@Ravindersing13
awk -F\| -v val=`date -d yesterday +%F` '{gsub($1, val)}1' file.csv
VALUE_DATE;TRADE_DATE;DESCR1;DESCR2
2019-03-05;2017-11-15;BRIDGE;HELLO
2019-03-05;2018-03-17;WORK;DATA
VALUE_DATE;TRADE_DATE;DESCR1;DESCR2
2019-03-06;2017-11-15;BRIDGE;HELLO
2019-03-06;2018-03-17;WORK;DATA
awk -v val=$(date -d yesterday +%F) 'BEGIN{FS=OFS=";"}FNR>1{$1=val} 1' file.csv
tmp=$(mktemp) && awk -v val=$(date -d yesterday +%F) 'BEGIN{FS=OFS=";"}FNR>1{$1=val} 1' file.csv > "$tmp" && mv "$tmp" file.csv