使用shell脚本将文件中的日期格式从dd / mm / yyyy更改为yyyy-mm-dd

时间:2017-10-31 21:46:40

标签: linux shell date unix scripting

我有一个包含18列的源文件,其中第10,11和15列的格式为dd / mm / yyyy,所有这些都需要转换为yyyy-mm-dd并与其他列一起写入目标文件。 我知道变量上的日期格式化功能,但不知道如何在文件中的几列上应用相同的功能。

4 个答案:

答案 0 :(得分:1)

我没有可用于测试的机器,但考虑使用awk具有一点功能,因为你做了3次同样的事情。它看起来像这样:

awk ‘
   function dodate(in){
      split(in,/\//,a)   # split existing date into elements of array “a”
      return a[3] “-“ a[2] “-“ a[1]
   }

   { $10=dodate($10); $11=dodate($11); $15=dodate($15); print }’ yourFile

awk functionssplit的参考。

如果每行上的字段用逗号分隔,请告诉awk

awk -F, ...

答案 1 :(得分:0)

也许您可以使用命令awk来解决它。

由于你有3个cols包含日期(col 10,11,15),这里我假设一个示例字符串,字段分隔符是|,col包含date是第4个col

aa|bb|cc|29/09/2017|dd|ee|ff

使用String-Manipulation Functions提取日期,然后使用getline对其进行格式化,以将其格式化为预期的语法。

命令是

echo 'aa|bb|cc|2017-09-29|dd|ee|ff' | awk -F\| 'BEGIN{OFS="|"}{$4=gensub(/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/,"\\3\\2\\1","g",$4); "date --date=\""$4"\" +\"%F\"" | getline a; $4=a; print $0}'

输出

aa|bb|cc|2017-09-29|dd|ee|ff

希望能帮到你。

答案 2 :(得分:0)

如果您安装了dateutils软件包,则可以使用dateutils.dconv

cat file | dateutils.dconv -S -i "%d/%m/%Y"
  • -i指定输入日期格式
  • -S sed模式,仅处理匹配的字符串并复制其余字符串

输入文件

aa|bb|cc|29/09/2017|dd|ee|ff|02/10/2017|gg

输出

aa|bb|cc|2017-09-29|dd|ee|ff|2017-10-02|gg

答案 3 :(得分:0)

我使用日期命令:

    while read fmtDate
      do
        date -d ${fmtDate} "+%Y-%m-%d"
     done