用于替换.csv文件第一列的Unix命令
我需要一个unix命令(我将在ControlM作业中调用该命令),该命令更改.csv文件第一列(而不是标题行)的值以及前一天的日期(预期格式:用于替换.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 或:
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