2013-02-25 69 views
1

讓我們看看下面的CSV文件格式:添加YYYY-MM-DD爲HH:MM:在CSV SS時間戳文件

server_name status_code timestamp probe_name 

其中STATUS_CODE可以I或E,以及各個領域的分離通過表格

舉個例子,我們可以考慮以下CSV行:

albatros.benches.com I 14:55:23.145 througput_probe 

每一個CSV文件包含了一整天值得日誌。我試圖讓所有HH:mm:ss的時間戳帶有前綴實際YYYY-MM-DD,這樣得到的線條將如下:

albatros.benches.com I 2013-02-25 14:55:23.145 througput_probe 

還有一個好處,因爲CSV文件保存日期(文件名是log_2013_02_25.txt),因爲我有很多這些文件(當然不同的日子)是'sed'ed',我希望我可以自動使用文件名作爲種子來抓取合適的日子並在時間戳轉換中應用它。

編輯:文件名是log_YYYY_MM_DD.txt,不log_YYYY-MM-DD.txt如前所述)

我的sed和正則表達式的知識是相當有限的。到目前爲止,我使用的是這樣的:

s/I^T/I^T 2013-02-25 /g 
s/E^T/E^T 2013-02-25 /g 

(^ T實際上是一個^ V後跟一個製表按鍵)

在我所有的文件,但是這真的看起來很彆扭我。如果有一天我們添加另一個狀態碼(例如X),這個技巧將不起作用。我想這會更容易讓sed處理第三個字段,並將其作爲前綴。我無法弄清楚如何正確地做到這一點。

任何想法歡迎!

謝謝

+0

日期和時間戳是否應該由製表位或僅由一個空格分開?此外,狀態碼是唯一字段,只有1個字符長? – speakr 2013-02-25 21:12:24

+0

@speakr:日期和時間由一個空格分隔。代碼字段恰好是1個字符是;) – SCO 2013-02-26 08:28:42

+0

是的,但是狀態字段__字段長度爲1個字符或者是否有其他任何長度相同的字段? – speakr 2013-02-26 09:14:56

回答

3

假設所有的CSV文件被命名爲喜歡log_YYYY_MM_DD.txt你可以嘗試在目錄中運行這個bash腳本在您的CSV文件:

#!/bin/bash 
for file in log_*.txt; do 
    [[ $file =~ [0-9]{4}_[0-9]{2}_[0-9]{2} ]] \ 
     && date="${BASH_REMATCH}" \ 
     && sed -E -i.bak "s/\t(E|I)\t/\t\1\t${date//_/-} /" $file 
done 

應該處理的所有狀態碼可以放在括號內。例如。也可以處理狀態碼X,只需將(E|I)更改爲(E|I|X)即可。

如果您發現一切正常,您可以刪除.bak以禁用創建備份文件。

+0

假設您的「原因代碼」將始終爲一個字符,並且沒有其他字段是一個字符,您可以使用'\ t。\ t'來代替'\ t(E | I)\ t'。 (如果你刪除'g',那麼只有_first_單字符字段會匹配。我認爲這個修飾符在這裏是多餘的。) – Mogsdad 2013-02-25 21:07:09

+0

@Mogsdad感謝您的輸入。關於一個char字段,我只是詢問OP瞭解他的csv數據的更多細節。 – speakr 2013-02-25 21:13:52

+0

確實工作得很好。但是文件名格式實際上使用下劃線,這使命名不那麼微不足道(讓我們說超出了我的bash/sed技能!)。 – SCO 2013-02-26 08:45:43