2013-10-29 36 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