我有一个文本文件,其中包含dd/mm/yyyy
格式的以下日期:
14/09/1992
15/04/1983
15/09/1961
02/06/1979
14/12/1971
08/02/2001
19/06/1999
14/09/1969
31/08/2002
30/07/1980
25/04/1973
03/01/1992
我想在脚本中将其转换为YYYY/mm/dd
格式。我打算使用date命令:
date -f tempDate +%Y/%m/%d
但问题是,它无法识别英式日期,并显示以下错误,因为我认为它是mm/dd/yyyy
,当我不想要它时:
date: invalid date `14/09/1992'
还有另一种方法吗?或者有没有办法可以改变日期格式的顺序?
另外,我需要这个脚本在我不是系统管理员的服务器上工作。
答案 0 :(得分:4)
您可以使用快速awk脚本更改为年/月/日订单:
awk -F '/' '{print $3"/"$2"/"$1}' < file.txt
答案 1 :(得分:3)
如果文件如上所述,为什么不只是用awk
反转列:
$ awk 'BEGIN{FS=OFS="/"}{print $3,$2,$1}' file
1992/09/14
1983/04/15
1961/09/15
1979/06/02
1971/12/14
2001/02/08
1999/06/19
1969/09/14
2002/08/31
1980/07/30
1973/04/25
1992/01/03
修改强>
在具有多个字段分隔符的awk
中同样容易:
$ awk -F[/,] '{print $1","$2","$5"/"$4"/"$3}' <<< "name,number,14/09/1992"
name,number,1992/09/14
答案 2 :(得分:2)
至少在Mac OS X上,迄今为止-f
选项记录为:
-f
使用input_fmt作为格式字符串来解析提供的new_date而不是使用默认值[[[mm]dd]HH]MM[[cc]yy][.ss]
格式。使用strptime(3)
完成解析。
因此,您应该使用:
date -f '%d/%m/%Y' +'%Y-%m-%d' ...
然而,剩余问题是转换多个值;你需要多次date
的调用,所以你想尝试类似的东西:
# Bogus code
while read date # Bogus code
do date -f '%d/%m/%Y' $date +'%Y-%m-%d' # Bogus code
done < tempDate # Bogus code
# Bogus code
然而,这会尝试设置系统时钟(除非您当时root
,否则不会非常成功,并且您在进行实验时不应该root
。因此,没有一种明显的方法可以让date
命令执行您想要的操作。
因此,使用awk
,sed
,perl
,python
和正则表达式来回答日期的答案是可行的方法。
答案 3 :(得分:1)
国际标准日期格式ISO 8601为YYYY-MM-DD
,而非YYYY/MM/DD
。我建议使用它,除非你有充分的理由不这样做。
美国和英国的日期格式对于每月13日之前的日期都不明确,因此date
无法识别日期并不奇怪。有一种方法可以告诉它给定的字符串是英国格式,但我不知道它是什么。
您可以使用sed
或任何其他进行正则表达式替换的工具来更改格式:
$ echo 14/09/1992 | sed 's/\([0-9][0-9]\)\/\([0-9][0-9]\)\/\([0-9][0-9][0-9][0-9]\)/\3-\2-\1/'
1992-09-14
Perl可以更简洁地做到这一点:
$ echo 14/09/1992 | perl -pe 's/(\d\d)\/(\d\d)\/(\d\d\d\d)/$3-$2-$1/'
1992-09-14
或:
$ echo 14/09/1992 | perl -pe 's/(\d{2})\/(\d{2})\/(\d{4})/$3-$2-$1/'
1992-09-14
答案 4 :(得分:0)
如果您使用的是Windows,您还可以更改区域设置以更改整个计算机上的日期格式,尤其是.csv文件:
Win7的:
1. /转到“开始”按钮 2. /选择控制面板 3. /时钟,语言和地区。 4. /更改日期,时间和数字格式。