2012-11-15 50 views
1

我有以下長文件在日誌文件中比較2個日期

2012-01-30 12:41:06,214 app10 device INFO [2012-01-30 12:40:46,214] info1 info2 info3 ... 

這是來自遠程脫機設備,如果TEH設備的時間(第二次)設置不正確,它指向的未來就意味着。如果第二次是指向未來,我想將其更改爲第一次日期。如果這是相同的或過去,我想離開它。只有日期很重要,完全不需要時間。第二次後,我們有幾個數據,有時不同的列數,我們希望保留。

例如:

2012-01-30 12:41:06,214 app10 device INFO [2013-01-30 12:40:46,214] info1 info2 info3 ... 

應該

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ... 

我們想從腳本運行這個,所以我更喜歡的bash,sed的,AWK或Perl的解決方案。 感謝你的幫助

+0

http://stackoverflow.com/questions/5895159/bash-script-compare-two-date-variables –

+0

請問您發佈的是什麼樣本輸入/輸出顯示了一個例子:「如果第二次是指向未來,我想將其更改爲第一次日期。如果這是相同或過去,我想將它作爲是。「? –

回答

2
awk -F '[[:space:][]+' ' 
    $6 > $1 {$6 = $1} 
    { 
     for (i=7; i<NF; i++) {$i = $(i+1)}; NF-- # delete time field 7 
     for (i=2; i<NF; i++) {$i = $(i+1)}; NF-- # delete time field 2 
     print 
    } 
' <<< "2012-01-30 12:41:06,214 app10 device INFO [2222-33-44 12:40:46,214] info1 info2 info3 ..." 

輸出

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ... 
+0

謝謝,這真棒 – user1797649

0

嗯,這可能會爲你工作,但它的第二個日期/時間之前增加了一個額外的空間,我把它留給你找出如何將其刪除:

awk 'BEGIN { FS="[ \\[]" } 
{ if (gensub("-","","g",$1) < gensub("-","","g",$7)) { $7 = $1 } 
    $7 = "[" $7 
    print 
}' INPUTFILE 

您可以see it in action here @ Ideone.com

0

另一個GNU AWK的替代方案。這一次保持原線路不變,如果第二個日期沒有改變:

awk -F '[][ \t]+' '$6>$1 {$6=$1; $2=$7=""; gsub(OFS"+", OFS);} 1' file 
+0

給字段賦值會導致awk重新編譯記錄,用OFS代替FS,所以gsub()什麼都不會做。 –

+0

@EdMorton你是部分正確的,給字段分配任何值都會導致awk重新編譯記錄,但是這裏的想法是避免將重新分配後剩下的額外「虛假」字段設置爲2美元和7美元。這是由gsub完成的。如果你拿出gsub,那麼$ 2和$ 7會顯示爲輸出中的額外空間(OFS),我認爲這是最好的避免。乾杯。 –

+0

啊,我明白了。然後你應該改變你的gsub()爲'gsub(OFS「+」,OFS)',因爲gsub()在所有FS已經被更改爲OFS之後執行,並且你的目的是轉換每個連續的OFS到一個OFS的序列。 –