如何转换文件中的日期格式

如何转换文件中的日期格式

输入文件:包含 3 列,其中第三列是DD-MMM-YYYY格式
示例数据中的日期:

1232,abdc, 02-Jan-2014
4534,kdafh, 20-Feb-2014
364,asjhdk, 11-Jul-2012

所需输出:

1232,abdc, 2014-01-02
4534,kdafh, 2014-02-20
364,asjhdk, 2012-07-11

使用函数日期:date -d 20-DEC-2014 +%Y-%m-%d
使用 awk 命令给出错误
还有其他方法吗?

答案1

使用 awk 的一种可能答案,假设输入文件是 input-file.txt ,输出文件是 output-file.txt :

awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d "$3" +%Y-%m-%d");}' input-file.txt > output-file.txt

答案2

使用磨坊主( mlr) 清理无标头 CSV 输入中过多的空格,然后重写第三个字段。通过使用strptime()时间格式字符串解析给定日期%d-%b-%Y,然后使用格式字符串重新格式化生成的 Unix 时间戳strftime()%F您可以使用,例如%Y-%m-%d代替%F)来重写第三个字段:

mlr --csv -N \
    clean-whitespace then \
    put '$3 = strftime(strptime($3,"%d-%b-%Y"),"%F")' file

给定问题中的数据,这将输出

1232,abdc,2014-01-02
4534,kdafh,2014-02-20
364,asjhdk,2012-07-11

如果您的数据在同一字段中具有时间戳,您可以调整strptime()strftime()调用中使用的格式字符串以满足您的需要。

请参阅系统手册,strftime了解这些格式化字符串的含义以及格式化日期和时间的选项。

答案3

假设你输入的文本是这样的:

1232,abdc, 02-Jan-2014 18:01:37</br> 
4534,kdafh, 20-Feb-2014 07:17:19</br>
364,asjhdk, 11-Jul-2012 23:20:30</br>

我的答案会变成:

cat input-file.txt | sed 's[</br>[[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

如果记录位于一行上(输入文件中 </br> 之后没有新行,则它会是

cat input-file.txt | sed 's[</br>[\n[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

答案4

您不想创建一个新进程来为文件的每一行执行 shell 和另一个命令,这将是非常低效的。使用基于输入的 shell 解释代码也是引入命令注入漏洞的一个秘诀。此外,该-d选项是非标准的。

在这里,我将使用可以进行时间操作的文本处理工具,例如 perl:

perl -MTime::Piece -pe '
  s{\d+-\w+-\d+$}{Time::Piece->strptime($&, "%d-%b-%Y")->ymd}e
  ' < your-file

在那里,我们匹配<digits>-<word-characters>-<digits>行末尾的 find ( $),将其解释为<day>-<month-abbrev>-<year>并重新格式化为<yead>-<month>-<day>使用 perl 的核心 Time::Piece 模块。

相关内容