我有一行包含很多條目,其中還有時間。
('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...
我想每次增加幾個小時。以 24 小時格式。例如10:30:00
會變成15:30:00
.
這項工作最好的通用工具是什麼?我正在考慮以下方面:
系統實用程序,例如
awk
,sed
..&以及我不知道的其他內容vim
腳本語言,例如
bash
python 或
規範的方法是什麼?
答案1
只是為了澄清:
vim
是大多數 *nix 系統上的系統實用程式(文字編輯器)。awk
、sed
、 和bash
是可用於解析和更改文字的語言(或工具,取決於上下文)。
您需要增加時間的目的是什麼?這些因素會影響您想要使用的工具。無論如何,這是一個多部分的工作,假設這不是 SQL:
您首先要匹配字串中的部分字串。您可以將
awk
、sed
、 或grep -e
與正規表示式一起使用來提取這些子字串。當您擁有這些值時,您將它們轉換為整數(或者如果您使用的是 Python 等更完整的語言,您可能可以使用庫將它們轉換為日期時間值)。您必須進行所需的數學計算(以及驗證,如果適用)來變更這些值。
最後,您將替換的值新增至該行並儲存變更後的檔案。
不過,老實說,這看起來像sql
,所以使用內建工具用那種語言來改變這些價值觀。
答案2
有一些很好的提示這個答案使用 Perl、Python、Ruby 等腳本語言建議一條阻力最小的路徑,該語言允許混合數學和匹配運算。
下面是一個使用 Perl 的快速技巧:
$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$
在這個簡單的範例中,數字字元類別 ( \d
) 後面跟著重複指示符(例如{2}
)用於捕獲日期的位置組成部分,並且我們盲目地對小時欄位進行算術運算。只有當您足夠了解資料以確保小時欄位上的簡單算術不會導致日期滾動時,這種類型的解決方案才適用。
當小時字段按照@Lieven的提示溢出時,重新審視這個問題以解決正確的日期/時間算術,Time::Piece
可以使用Perl核心模組(Perl>5.8):
$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
perl -MTime::Piece -pe \
's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
Time::Piece->strptime($1, "%Y-%m-%d %T") \
+ (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$
此範例輸入已更新,以顯示對滾動到第二天的小時值的優雅處理。它在命令列中提取Time::Piece
模組,匹配輸入中的日期時間,轉換為Time::Piece
物件以執行日期/時間算術,然後字串化回所需的輸出格式。