Date getline、awk和日期(格式化日期)

Date getline、awk和日期(格式化日期),date,awk,getline,Date,Awk,Getline,我正在尝试在CSV文件中格式化一些日期数据 ~/temperature$ cat m 1 01/04/13 02:20:07 PM 21.843 24.360 981.5 2 01/04/13 02:25:07 PM 21.509 27.048 335.1 3 01/04/13 02:30:07 PM 19.555 31.441 335.1 4 01/04/13 02:35:07 PM 18.628 32.154 335.1 5 01/04/13 02:40:07 PM

我正在尝试在CSV文件中格式化一些日期数据

~/temperature$ cat m
1 01/04/13 02:20:07 PM 21.843 24.360 981.5   
2 01/04/13 02:25:07 PM 21.509 27.048 335.1   
3 01/04/13 02:30:07 PM 19.555 31.441 335.1   
4 01/04/13 02:35:07 PM 18.628 32.154 335.1   
5 01/04/13 02:40:07 PM 18.152 31.782 327.2   
6 01/04/13 02:45:07 PM 17.962 34.723 327.2   
7 01/04/13 02:50:07 PM 17.867 33.008 335.1   
8 01/04/13 02:55:07 PM 17.819 35.722 327.2   
9 01/04/13 03:00:07 PM 17.819 33.989 327.2   
10 01/04/13 03:05:07 PM 17.796 36.143 327.2
我想将日期转换为“YYYY-MM-DD HH:MM:SS”格式

以下是我尝试过的:

~/temperature$ awk '{("date \"+%Y-%m-%d %T\" --date \"$2 $3\"")|getline t; print t}' m
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00
2014-03-28 00:00:00

~/temperature$ awk '{("date \"+%Y-%m-%d %T\" -d "$2 )|getline t; print t}' m
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
2013-01-04 00:00:00
~/temperature$ awk '{("date \"+%Y-%m-%d %T\" -d "$2" "$3)|getline t; print t}' m
date: extra operand `02:20:07'
Try `date --help' for more information.

date: extra operand `02:25:07'
Try `date --help' for more information.

...
...
因此,这两种方法都给出了错误的日期。有没有办法解决这个问题? 非常感谢

DY.

这将起作用:

$ awk '
{
    get_date = "date \"+%Y-%m-%d %T\" -d \""$2" "$3" "$4"\""
    get_date | getline new_date
    print new_date
}' file
2013-01-04 14:20:07
2013-01-04 14:25:07
2013-01-04 14:30:07
2013-01-04 14:35:07
2013-01-04 14:40:07
2013-01-04 14:45:07
2013-01-04 14:50:07
2013-01-04 14:55:07
2013-01-04 15:00:07
2013-01-04 15:05:07

这就是你想要做的吗

$ awk '{split($2,d,"/"); $2="20"d[3]"-"d[1]"-"d[2]}1' file
1 2013-01-04 02:20:07 PM 21.843 24.360 981.5
2 2013-01-04 02:25:07 PM 21.509 27.048 335.1
3 2013-01-04 02:30:07 PM 19.555 31.441 335.1
4 2013-01-04 02:35:07 PM 18.628 32.154 335.1
5 2013-01-04 02:40:07 PM 18.152 31.782 327.2
6 2013-01-04 02:45:07 PM 17.962 34.723 327.2
7 2013-01-04 02:50:07 PM 17.867 33.008 335.1
8 2013-01-04 02:55:07 PM 17.819 35.722 327.2
9 2013-01-04 03:00:07 PM 17.819 33.989 327.2
10 2013-01-04 03:05:07 PM 17.796 36.143 327.2
或者你也需要改变时间格式吗

awk '{split($2,d,"/"); $2="20"d[3]"-"d[1]"-"d[2];
      split($3,t,":"); if(sub(/PM /,"")) t[1]+=12; $3=t[1]":"t[2]":"t[3]
     }1' file
1 2013-01-04 14:20:07 21.843 24.360 981.5
2 2013-01-04 14:25:07 21.509 27.048 335.1
3 2013-01-04 14:30:07 19.555 31.441 335.1
4 2013-01-04 14:35:07 18.628 32.154 335.1
5 2013-01-04 14:40:07 18.152 31.782 327.2
6 2013-01-04 14:45:07 17.962 34.723 327.2
7 2013-01-04 14:50:07 17.867 33.008 335.1
8 2013-01-04 14:55:07 17.819 35.722 327.2
9 2013-01-04 15:00:07 17.819 33.989 327.2
10 2013-01-04 15:05:07 17.796 36.143 327.2

您的第一个awk命令将日期传递为
“$2$3”
(shell将其视为shell变量并用空值替换)。我想你的意思是,
——日期\“2美元”“3美元”“
在那里。使用
shell
调用
awk
调用
shell
调用
date
可能不是一个好方法。在这种情况下,调用
date
将提供什么值实际上并不清楚。另外,如果您正在考虑在awk中使用
getline
,请确保您首先阅读并完全理解所有的注意事项。请不要使用awk。信息+1:这是我想要建议的,尽管OP和社区的声音让我有点失望。谢谢。这很有效。尽管我仍在努力理解为什么我的命令不起作用。有关于我为什么错的线索吗?看看我是如何引用语法的。你的报价是错误的。