2013-10-29 99 views
1

我在日志文件中一堆的日期使用的年份格式,而不是一个月格式的当日的日:在SED表达减去一个值

所以我看到:

2013-10-302 

代替

2013-10-29 

我希望他们在月份格式的日子。所以我这样做:

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

但这种方法的问题是,我有几个日期,我需要转换。如果月份是10,那么我可以做一些事情,然后再从一天中减去273。如果月份是9,则减去其他值。

所以,即使没有更好的方法,任何提示如何我会这样做?即如果是第10个月减去273?

Thansk

回答

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 
1

你得到在%Y-%间引用%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日起的第3天:

$ 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