【问题标题】:"invalid date" error message when converting date format from csv file ? -shell从 csv 文件转换日期格式时出现“无效日期”错误消息? -贝壳
【发布时间】:2020-06-07 05:53:56
【问题描述】:

我是 shell 脚本的新手,我正在尝试从具有格式日期的 csv 列中获取星期几:

16/10/2015
19/06/2010
16/09/2013
4/7/2008
29/12/2017

我使用 date -%A 并将结果转换但不是全部转换,但仍然收到带有结果的错误消息:

date: invalid date ‘16/10/2015’ 
date: invalid date ‘19/06/2010’ 
date: invalid date ‘16/09/2013’ 
Monday 
date: invalid date ‘29/12/2017’ 
Monday

预期输出:

Friday
Saturday
Monday
Wednesday
Friday

我的代码:

cat file.csv | awk -F "," 'NR>1 {print $4}' | awk -F, '{"date +%A -d\""$1 "\""| getline dte;$1=dte}1' OFS=","

我还尝试在转换之前将值重新格式化为日期类型,以确保但仍然收到错误消息,我有一个大数据文件,这就是为什么我试图在 awk 中循环整个列

【问题讨论】:

  • 您能否通过在问题中提及预期输出示例来添加更多详细信息,然后让我们知道。
  • 我用预期的输出更新了我的帖子
  • 首先将16/10/2015 转换为2015/10/16

标签: shell csv date awk date-arithmetic


【解决方案1】:

使用 GNU awk 将日期快速转换为星期几的全名:

awk 'BEGIN{FS="/"} {t=sprintf("%d %d %d 0 0 0",$3,$2,$1); print strftime("%A",mktime(t))}' Input_file

见:gawk - Date and time calculation functions

【讨论】:

  • 这要快得多!还有我需要的大数据文件,你能解释一下这部分吗sprintf("%d %d %d 0 0 0",$3,$2,$1)
  • 字段分隔符为/。如果当前行包含16/10/2015,则t=sprintf("%d %d %d 0 0 0",$3,$2,$1) 将其重新格式化为字符串2015 10 16 0 0 0 并将其保存到tt 现在包含 mktime 的正确格式。 sprintf 使用与 printf 相同的语法。
【解决方案2】:

您能否尝试在纯 bash 中进行以下操作(仅使用提供的示例进行测试和编写)。

while read line
do
  IFS='/' read -ra arr <<< "$line"
  newDate=${arr[2]}/${arr[1]}/${arr[0]}
  date -d  $newDate +%A
done < "Input_file"

对于提供的示例,以下将是输出。

Friday
Saturday
Monday
Friday
Friday

【讨论】:

  • 是的,我做到了:)。只是一件小事,请问这种方式对大文件有好处吗?它比我的数据文件中的 awk 需要更长的时间
  • @Mar,老实说,我没有检查大数据文件,但相信我,这应该是最简单的一个。即使您将 bash 命令放入 awk 命令中也可能需要时间(不能说 100% 但是),您也可以检查一次。
  • 我可以将结果流水线化以使用sort | uniq 吗?因为只有当我添加管道时才需要很长时间
  • @Mar、sortuniq 但不确定您为什么需要它们?如果您想执行一些进一步的操作(我目前不确定您想要做什么),您可以将输出放入输出文件,然后可以对它们执行操作?
  • 使用 awk:awk 'BEGIN{FS=OFS="/"}{print $3,$2,$1}' Input_file | xargs -n 1 date +%A -d
猜你喜欢
  • 2019-10-09
  • 2019-08-03
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2017-12-17
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多