我想要一个unix命令(我将在ControlM作业中调用),该命令会更改.csv文件第一列(而不是标题行)的值,以及前一天的日期(预期格式:{ {1}}。
我尝试了许多命令,但是没有一个命令让我想要:
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,但不起作用。
我想要的例子: 输入:
awk -F\| -v val=`date -d yesterday +%F` '{gsub($1, val)}1' file.csv
我想要的输出(今天是2019年3月7日):
VALUE_DATE;TRADE_DATE;DESCR1;DESCR2
2019-03-05;2017-11-15;BRIDGE;HELLO
2019-03-05;2018-03-17;WORK;DATA
能帮我个忙,请提供示例示例,我没有找到解决方法。
非常感谢
答案 0 :(得分:0)
您可以先尝试以下吗?(不将输出保存到file.csv
本身,它将在终端上打印输出一次,然后您可以使用答案
在这篇文章的最后提供)
awk -v val=$(date -d yesterday +%F) 'BEGIN{FS=OFS=";"}FNR>1{$1=val} 1' file.csv
在OP的代码中发现的问题(并在我的建议中已解决):
1-现在不推荐使用backtick来保存shell变量的值,因此请使用val=$(date....)
来声明名为val
的awk变量。
2-使用-F
,您已经将字段分隔符设置为\|
,这是管道,但是当我们仔细看到您提供的示例Input_file时,它用;
分隔(半冒号)不是|
,所以这也是它没有反映在输出中的原因之一。
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