我有一個包含第一列.csv
格式的日期和時間的文件。01/20/2016 23:53:01
我的列用分號分隔,即
01/21/2016 03:03:01;18616;0;1
01/21/2016 03:13:01;29040;36553;2
…
在所以我找到了 bash 指令
date -d '06/12/2012 07:21:22' +"%s"
這適用於我想要的。我現在一直在嘗試集成awk
以替換第一列。我找到了一個回答類似問題:
awk -F'"' -v OFS='"' '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json
我試著適應我自己的輸入。但我得到的輸出是空的。
答案1
我終於在寫問題時避開了它。所以這是我的解決方案:
awk -F';' -v OFS=';' '$1 {cmd="date -d \""$1"\" +%s"; cmd | getline $1; close(cmd)} 1' datetime.csv > unix.csv
這是兩件事的結合:我錯過了開啟"
,+%s"
並且我的輸入中有一條斷線。
答案2
GNU date 有一個-f
選項可以逐行轉換從檔案讀取的日期。如果您的檔案很長,這將比date
每行調用一次更快。日期需單獨就行;因此計劃是隔離第一列 ( cut -d \; -f 1
),運行該列date -f -
以執行轉換,並且貼上剩餘列的結果。
paste -d \; <(<input cut -d \; -f 1 | date -f - +%s) <(<input cut -d \; -f 2-)
這假設您的 shell 支持流程替代(ksh93、bash、zsh)。對於 plain sh
,在支援(大多數支援)的 Unix 變體上/dev/fd
,您可以使用檔案描述符改組:
<input cut -d \; -f 2- | {
exec 3<&0
<input cut -d \; -f 1 | date -f - +%s | paste -d \; - /dev/fd/3
}
答案3
嗯嗯。好吧,這是不久前的事,但我想不妨提出一個建議。
我相當確定,如果您有很多行,那麼進入 shell 為檔案的每一行呼叫“date”可能會有點慢。
我打算編寫一個腳本來處理從 Google 日曆中提取的時間表條目,並輸出一些 HTML,然後轉換為 PDF 發票。但後來談這個話題就太長了。所以我只是給你代碼以節省閱讀時間。
我正在使用 AWK 函數 gensub 和 mktime [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html]。 mktime 函數需要 datespec 格式的輸入“YYYY MM DD HH MM SS [DST]”,因此您的輸入需要在 gensub 函數所在的位置移動。
awk -F';' -v OFS=';' '{ $1=mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)); } 1' datetime.csv > unix.csv
我會做一些不同的事情,並在列印中輸出各個參數,而不是寫回第一個參數。多一點自我記錄;) 提姆托維迪
awk -F';' -v OFS=';' '{ print mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)), $2, $3, $4; }' datetime.csv > unix.csv
我知道該腳本有點冗長,但希望它的性能更高。
希望這對您或其他看到相同事情的人有所幫助。