簡體   English   中英

使用awk修改多列

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

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