[英]using awk to modify multiple columns
我有一個包含兩列的csv文件:ISO8601中的日期字符串和linux時間戳。 如何使用awk
獲取以下格式的輸出:col-1:原始ISO; col-2:將時間戳記(2)轉換為ISO8601; col-3:兩次之間的差異(例如,以毫秒為單位)
例:
輸入 :
2018-01-09T16:55:22.545+0000,1515508979185
輸出 :
2018-01-09T16:55:22.545+0000,2018-01-09T14:42:59.185+0000,36743360
Gawk具有所有必需的功能,可以在不同格式之間轉換日期和時間。 這是Gawk的擴展。
考慮以下命令
awk -F, '{ patsplit($1,a,"[0-9]*");
time1 = mktime(sprintf("%d %d %d %d %d %d",
a[1], a[2] ,a[3], a[4], a[5], a[6]))*1000 + a[7];
time2 = mktime(strftime("%Y %m %d %H %M %S",$2/1000,a[8]))*1000 +$2 %1000;
isodate2 = strftime("%Y-%m-%dT%H:%M:%S",$2/1000,a[8]);
printf "%s;%s.%03d;%s\n",
$1,
isodate2,$2 % 1000,
time1 - time2}' csvfile
它會產生
2018-01-09T16:55:22.545+0000;2018-01-09T14:42:59.185;7943360
我們使用,
作為字段分隔符,因為輸入是CSV文件。 首先,我們解析第一列參數,它是一個ISO 8601日期。 我們使用patsplit()
將ISO 8601字符串中的所有數字提取到數組a
以便
a[1] = YYYY, a[2] = mm, a[3] = dd,
a[4] = HH, a[5] = MM, a[6] = SS, a[7] = uuu
我們使用數組a
將第一列日期轉換為時間戳,並計算以微秒為單位的差異,並將結果存儲在time1
變量中。
在這里處理時區需要在第一個時間戳的時區中計算第二個時間的等效值。
然后我們從第一列開始打印輸出行; 使用strftime
將時間戳從第二列轉換為ISO8601日期,並分別打印微秒。
time1和time2之間的差異與原始帖子中的不同。
awk
解決方案:
awk 'BEGIN{ FS=OFS="," }
{
cmd1 = "date -d"$1" +%s";
cmd2 = "date -d@"int($2/1000)" +%FT%T.%3N%z";
cmd1 | getline d1; close(cmd1);
cmd2 | getline d2; close(cmd2);
print $1, d2, d1*1000 - $2
}' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.