如何在 ubuntu 中更改日期格式

如何在 ubuntu 中更改日期格式

Qgis 中的时间管理器要求日期采用 YYYY-MM-DD 格式。我有一个大型文本文件,其中的日期采用 DD/MM/YYYYY 格式。它太大了,无法手动更改格式。有没有办法自动执行此过程?我尝试在 Libre Office 中更改格式,但它仍然保持原始格式。所需的日期格式为 2020-01-16。人名字段已删除。

Record ID   English Name    Grid Reference  Latitude    Longitude   Site Name   Abundance   Record Type Date    Comments    Time of sighting    Squirrel ID Weight (g)  CRST Comments
7765235 Red Squirrel    SJ0369952368    53.059853   -3.4384031  Clocaenog: Bron Branog: Location 10 1 Adult     01/10/2020      13:09           
7765230 Red Squirrel    SJ0367552319    53.059408   -3.4387464  Clocaenog: Bron Branog: Location 9  1 Adult     01/10/2020      16:54           
7761554 Red Squirrel    SH9856552277    53.058084   -3.5149526  Clocaenog: Pentre-llyn-cymmer: Location 5   1       01/10/2020      17:22           
7761417 Red Squirrel    SJ0454252299    53.059384   -3.4258081  Clocaenog: Main Block East: Location 15 1       01/10/2020      16:36           
7761416 Red Squirrel    SJ0454252299    53.059384   -3.4258081  Clocaenog: Main Block East: Location 15 1       01/10/2020      08:51           
7765217 Red Squirrel    SJ0357152125    53.057646   -3.4402395  Clocaenog: Bron Branog: Location 7  1 Adult     02/10/2020      13:42           
7765210 Red Squirrel    SJ0354052072    53.057164   -3.440686   Clocaenog: Bron Branog: Location 5  1 Sub-adult     02/10/2020      16:07           
7765209 Red Squirrel    SJ0354052072    53.057164   -3.440686   Clocaenog: Bron Branog: Location 5  1 Adult     02/10/2020  Patchy squirrel 13:54   

答案1

如果您想以自由格式的文本重新格式化日期字符串,我建议使用 Perl,因为它允许您将 sed 样式的s/pattern/replacement/正则表达式搜索和替换与 Unix 样式strptime和相结合strftime。例如。

perl -MTime::Piece -pe '
  s;\d{4}-\d{2}-\d{2};Time::Piece->strptime($&,"%Y-%m-%d")->strftime("%d/%m/%Y");ge
' yourfile

对于列式数据,我可能会选择 Miller - 它有一个内置的strptime/ strftime,您可以逐个字段应用它。

答案2

日期命令将日期转换为您所指定的任何内容......

date -d "10/28/2020" +%Y-%m-%d
2020-10-28


If there is only dates in the file thedates.txt
10/28/2020
10/29/2020
11/27/2021
12/20/2020
5/6/1999
11/6/73
11/11/2011

...然后可以使用 date 命令读取该文件date -f thedates.txt +%Y-%m-%d

2020-10-28
2020-10-29
2021-11-27
2020-12-20
1999-05-06
1973-11-06
2011-11-11 
2020-10-21<---- and if you unintentionally read something like a blank line at the end of the file.. it will translate that to today's date... dont leave blanks or parse them out. 

如果文件中不仅仅只有日期(很可能),那么您需要使用我担心的语句来解析dates.txt文件for并将它们放入变量中,然后使用 -d 标志在$variable上运行date命令,如上所述,然后将格式化的输出发送回所需的位置....

这使得转换变得非常简单,但解析却使其变得笨拙……
至少对于像我这样不熟练使用正则表达式/脚本的人来说是这样。根据尚未看到的样本数据的难度,这可能会帮助另一个答案,即使没有别的。

答案3

我对你的文本文件的结构/外观一无所知,我假装它只有一列,即日期字段:

$ awk '{a=gensub(/(..)\/(..)\/(....)/,"\\3-\\2-\\1","1",$0); print a}' file.txt
2020-02-01

要将其放入文件(而不是屏幕上),请重定向输出:

$ awk '{a=gensub(/(..)\/(..)\/(....)/,"\\3-\\2-\\1","1",$0); print a}' file.txt  >new_text_file

其中file.txt应替换为您的文件的名称。

答案4

在 Calc 中插入新的日期列,将列格式设置为 YYYY-MM-DD。突出显示/复制原始日期列,但在粘贴时选择“特殊”、“粘贴为未格式化的文本”。然后它会保留所需的格式,这样您就可以删除原始(格式错误的)日期列。感谢 Wu-Tang 为我指明了正确的方向。

相关内容