我想在 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 与输入文件完全相同。我想知道这里可以改变什么。
仅使用您显示的示例,请尝试在 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
假设:
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
假设:
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