[英]Convert first column of file to unixtime using grep and awk
我有一個文件(名為2n.log),希望將第一列中的人類可讀日期和時間轉換為Unix時間:
2016-03-14 15:00:35,998191
2016-03-14 15:02:19,998181
在命令行上,如果我使用date命令,則會獲得正確的Unix時間戳,例如
user@server1:~# date -d "2016-03-14 15:02:19" "+%s"
1457967739
但是,如果我在awk中輸入相同的命令,則會得到錯誤的unix時間戳值,這是我使用的bash腳本(名為2n.sh:
#!/bin/env bash grep ".*2016" 2n.log | awk -F ',' -v dt="$(date -d "$1" "+%s")" '{print dt","$2}'
這是輸出:
user@server1:~# sh 2n.sh
1457913600,998191
1457913600,998181`
grep通配符是問題還是awk聲明是問題? 我嘗試將grep通配符替換為“ 2016. *”,但根本沒有得到任何輸出。
謝謝
您不是從第一個字段開始計算日期,此時Shell仍在負責。 你可以這樣做
$ awk -F, '{cmd="date -d \""$1"\" +%s"; cmd | getline date; print date, $2}' logfile
1457982035 998191
1457982139 998181
添加-v OFS=,
用於逗號分隔的輸出。
這應該與您的示例:
awk -F, -v q='"' '$0="echo "q"$(date -d"q$1q" +%s),"$2q' file|sh
測試一下:
kent$ cat f
2016-03-14 15:00:35,998191
2016-03-14 15:02:19,998181
kent$ awk -F, -v q='"' '$0="echo "q"$(date -d"q$1q" +%s),"$2q' f|sh
1457964035,998191
1457964139,998181
如果您已經使用了gnu sed ,那么此行也適用:
sed -r 's/([^,]*)(,.*)/echo $(date -d"\1" +%s\2)/ge' file
我會使用該語言的內置時間函數,而不是使用date
gawk -F, -v OFS=, '{gsub(/[:-]/, " ", $1); $1 = mktime($1); print}' file
perl -MTime::Piece -F, -lane '
$F[0] = Time::Piece->strptime($F[0], "%Y-%m-%d %T")->epoch;
print join ",", @F
' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.