在 Awk 中使用 gsub 通过正则表达式重新格式化日期

问题描述 投票:0回答:2

我想在 Awk 中使用 gsub 将日期从 DD/MM/YYYY 重新格式化为 YYYY-MM-DD。

我使用了命令:

awk '{gsub(/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/, "([0-9]{4})\-([0-9]{2})\-([0-9]{2})", $4)}1' OFS='       ' example.tsv > example_date.tsv

在输入文件上:

No  Name    LastName    Date    
1   Jane    Doe         24/05/78    
2   James   Cook        04/04/74    
3   Jack    Smith       24/05/78
4   John    Beck        20/10/80

输出文件 example_date.tsv 与输入文件完全相同。我想知道这里可以改变什么。

date awk gsub
2个回答
0
投票

仅使用您显示的示例,请尝试在 GNU

awk
中执行以下操作。

  • 将所有行的
    RS
    (记录分隔符)设置为
    [[:space:]]+[0-9]+\\/[0-9]+\\/[0-9]+(\\s+|$)
    ,以获得根据问题在此处编辑的所需值。
  • 然后使用
    RT
    函数检查
    match
    的值是否为 NOT NULL,以获取捕获组中的 RT 值,以便稍后根据 OP 的要求更改其顺序。
awk -v RS='[[:space:]]+[0-9]+\\/[0-9]+\\/[0-9]+(\\s+|$)' '
RT && sub(/\n+$/,"",RT){
  match(RT,/^([[:space:]]+)([^/]+)\/([^/]+)\/([0-9]+)(.*)$/,arr)
  print $0 arr[1] arr[4] "/" arr[3] "/" arr[2] arr[5]
}
' Input_file

0
投票

假设:

  • OP 的真实数据包含
    YYYY
    格式的日期(根据 OP 的评论)
  • 输入/输出字段分隔符是制表符 (
    \t
    )

设置:

$ cat example.tsv
No      Name    LastName        Date
1       Jane    Doe     24/05/1978
2       James   Cook    04/04/1974
3       Jack    Smith   24/05/1978
4       John    Beck    20/10/1980

一个

awk
想法:

awk '
BEGIN { FS=OFS="\t" }
NR>1  { split($4,a,"/")                       # split 4th field on "/" delimiter and place in array a[]
        $4 = a[3] "-" a[2] "-" a[1]           # rebuild 4th field in YYYY-MM-DD format
      }
1
' example.tsv

这会生成:

No      Name    LastName        Date
1       Jane    Doe     1978-05-24
2       James   Cook    1974-04-04
3       Jack    Smith   1978-05-24
4       John    Beck    1980-10-20

假设:

  • 输入字段分隔符是空格(可以是空格、制表符或混合); OP的样本数据显示为固定宽度
  • OP 的
    gsub()
    正则表达式仅匹配第 4 列

设置:

$ cat example.tsv
No    Name      LastName    Date
1     Jane      Doe         24/05/1978
2     James     Cook        04/04/1974
3     Jack      Smith       24/05/1978
4     John      Beck        20/10/1980

一个

awk
想法:

awk '
{ split($4,a,"/")
  gsub(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/,a[3] "-" a[2] "-" a[1])
}
1
' example.tsv

这会生成:

No    Name      LastName    Date
1     Jane      Doe         1978-05-24
2     James     Cook        1974-04-04
3     Jack      Smith       1978-05-24
4     John      Beck        1980-10-20
© www.soinside.com 2019 - 2024. All rights reserved.