簡體   English   中英

使用grep和awk將文件的第一列轉換為unixtime

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM