1

我在日志文件中有一堆日期,它们使用年份格式而不是月份格式:

所以我看到:

2013-10-302

代替

2013-10-29

我希望它们采用月份格式。所以我这样做:

sed "s/2013-10-302/2013-10-29/

但是这种方法的一个问题是我需要转换几个日期。如果月份是 10,我可以做类似的事情,然后从一年中的一天中减去 273。如果月份是 9,则减去其他内容。

因此,即使没有更好的方法,关于我如何做到这一点的任何提示?即如果是第10个月减去273?

坦斯克

4

2 回答 2

1

您正在以 %Y-%m-%j 格式获取日期,其中%j代表一年中的某一天。

如果你这样做呢?

$ date -d "Jan 1 2013 + 302 days" "+%F"
2013-10-30

把它放在上下文中,如果你有一个像

$ cat a
2013-10-302

您可以通过以下步骤“清理”它:

$ cat a
2013-10-302

获取自 1 月 1 日以来的旧日期和第三个字段:

$ old_date=$(cat a)
$ echo $old_date
2013-10-302
$ day=$(cut -d- -f3 <<< "$old_date")
$ echo $day
302

计算实际日期并更新文件:

$ new_date=$(date -d "Jan 1 2013 + $day days" "+%F")
$ echo $old_date, $new_date
2013-10-302, 2013-10-30
$ sed -i "s/$old_date/$new_date/g" a
$ cat a
2013-10-30
于 2013-10-29T15:32:23.393 回答
1

尝试使用awk

awk 'BEGIN {
    FS=OFS="-"
} {
    cmd="date -d "$1"-"$2"-01 +%j"; 
    cmd | getline offset; 
    $3=sprintf("%02d",$3-offset+1); 
    print
}' file

测试

输入文件

2013-10-302
2013-11-310
2013-09-268

输出

2013-10-29
2013-11-06
2013-09-25
于 2013-10-29T15:56:13.527 回答