如何在csv文件中汇总2小时到日期列

时间:2017-11-30 10:48:57

标签: bash awk

我的csv文件由2列组成,名称和日期为24小时格式

Name, log_date

John, 11/29/2017 23:00

我想添加2小时的日志日期来更改日期和时间,如下所示

John, 11/30/2017 01:00

我尝试通过以下命令添加它但没有成功

awk - F 'NR>1{$4+=(2/24);}1' OFS="," IN.csv > OUT.csv

我得到以下输出

2017.08

在日志日期列的值

所以请帮助

4 个答案:

答案 0 :(得分:2)

您需要一种具有日期时间算术的语言。 Perl例如:

perl -MTime::Piece -F'/,\s*/' -slane '
    $datetime = Time::Piece->strptime($F[1], $fmt);
    $F[1] = ($datetime + 7200)->strftime($fmt);
    print join ", ", @F
' -- -fmt="%m/%d/%Y %H:%M" <<END
John, 11/29/2017 11:00
END
John, 11/29/2017 13:00

鉴于您的输入,无法指示时间是晚上11点。你怎么知道的?

答案 1 :(得分:1)

下面的

是python中的oneliner。这真的不是一个可用的代码,但我相信你可以了解使用单行代码。这种单线程可以更简单。

python -c "s=r'John, 11/29/2017 13:00'; 
print(s.replace(s.split(\" \")[-1].split(\":\")[0],str(int(s.split(\" \")[-1].split(\":\")[0])+2)));";

输出

John, 11/29/2017 15:00

然而,这不会像日期23 + 2 = 25那样滚动,应该假设是1:00

答案 2 :(得分:0)

awk -F',' '{if(NR>1){printf("%s, ", $1);system("date -d \"+2 hours " $2 "\" +\"%m/%d/%Y %H:%M\"")}else{print $0}}' IN.csv > OUT.csv

答案 3 :(得分:0)

所有您正在寻找的内容都记录在案here

使用空格作为字段分隔符:

{
     split($2,D,"/")
     split($3,H,":")
     # format for mktime is "YYYY MM DD HH MM SS [DST]"
     d = D[3] " " D[1] " " D[2]" " H[1] " " H[2] " 00"
     t=mktime(d)
     t = t + 7200 # add two hours
     $2 = strftime("%m/%d/%Y",t)
     $3 = strftime("%H:%M",t)
}1