【问题标题】:Unix command to replace first column of a .csv file用于替换 .csv 文件第一列的 Unix 命令
【发布时间】:2019-03-07 23:51:26
【问题描述】:

我想要一个 unix 命令(我将在 ControlM 作业中调用),它可以更改我的 .csv 文件的第一列(不是标题行)的值,以及前一天的日期(预期格式:@ 987654321@).

我尝试了很多命令,但没有一个是我想要的:

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

或:

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

请您帮忙并给我一些应该有效的命令示例,我没有找到解决方案。

非常感谢

【问题讨论】:

  • 欢迎来到 SO,建议将您的示例/代码包装在 CODE TAGS 中,您可以在编辑帖子时使用{} 按钮来做到这一点。感谢 jxc 为这个做了它但请记下以后的帖子。

标签: unix awk gsub


【解决方案1】:

您能先尝试一下吗?(不将输出保存到file.csv 本身它会在终端上打印输出一旦高兴然后你可以使用答案 在这篇文章的最后提供)

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

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

1- 现在不赞成使用反引号来保存 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-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

【讨论】:

  • 这太棒了。非常感谢@RavinderSingh13
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多