Ubuntu

尋找一種將星期幾附加到行尾的方法

  • November 7, 2019

在 Ubuntu 16.04 中,我試圖找到一種方法,在給定欄位 4 中的日期的情況下,將星期幾附加到文本文件中每一行的末尾。

樣本數據:

Server ID,Make,"Server Room",Datestamp,Timestamp,Distance,Ping,Download,Upload,Payload,"Src IP Address",Hour,DOW
x6883101,HP,"Server Room A",2019-07-14,04:50:02,26.444,11.521,49193480,41904833,,192.168.1.1,4, 
s3398577,Dell,"Server Room B",2019-09-21,10:50:02,56.574,37.608,48955461,45858381,,192.168.1.1,10, 
x6883551,Dell,"Server Room A",2019-08-16,02:00:04,26.444,17.921,86551957,88775986,,192.168.1.1,2, 
s1555023,HP,"Server Room C",2018-02-06,04:50:01,516.574,402.527,907658,608152,,192.168.1.1,4, 
s3398023,HP,"Server Room B",2019-01-17,10:50:01,56.574,40.233,48484827,45620028,,192.168.1.1,10, 
s1555098,IBM,"Server Room C",2018-11-18,02:00:03,516.514,404.671,819027,601233,,192.168.1.1,2, 
x6883582,Dell,"Server Room A",2019-05-19,04:50:02,26.444,12.506,88871436,84360552,,192.168.1.1,4,

例如,對於數據線 #1 和 #2:

x6883101,HP,"Server Room A",2019-07-14,04:50:02,26.444,11.521,49193480,41904833,,192.168.1.1,4,Sunday
s3398577,Dell,"Server Room B",2019-09-21,10:50:02,56.574,37.608,48955461,45858381,,192.168.1.1,10,Saturday

我嘗試了各種 SED 和 AWK,但一無所獲。我試過 DATE 命令,但它似乎不喜歡輸入。我已經能夠將實際日期與

grep -w -o “20

$$ 0-9 $$$$ 0-9 $$-$$ 0-9 $$$$ 0-9 $$-$$ 0-9 $$$$ 0-9 $$*”

但我看到的任何東西都無法轉換它並將 DOW 附加到行尾。

我錯過了什麼使得將星期幾附加到每行數據的末尾?此外,我需要能夠從 CRONTAB 工作中做到這一點。

使用 GNU awk,您可以:

gawk -i inplace -F, -v OFS=, -v date_field=4 '
 (t = mktime(gensub("-", " ", "g", $date_field) " 0 0 0")) > 0 {
   $NF = strftime("%A", t)};1' your-file
  • -i inplace: 啟用 gawk 的就地編輯模式,從而將輸出寫入一個新文件,以替換輸入文件。

  • -F,-v OFS=,設置輸入和輸出欄位分隔符

  • mktime()是一個 GNU awk 擴展,它解析year month day hour minute second格式中的字元串並返回相應的 Unix 紀元時間。在這裡,我們使用gensub()(另一個 gawk 擴展)將-第 4 個欄位 ( YYYY-MM-DD) 中的空格替換為空格,以便將YYYY MM DD 0 0 0時間傳遞給mktime()

  • (t = mktime(...)) > 0 {...}並且1是在每個輸入記錄上執行的兩condition {action}對(此處為lines)。

    • 對於第一個,條件檢查mktime()(assigned to t) 返回的值是否大於 0(如果無法解析日期規範則返回),在這種情況下mktime()執行操作。(另一個 gawk 擴展)像它的 C 等價物一樣用於格式化時間(這裡是儲存在格式中的 unix 紀元時間:本地化的工作日名稱)。我們將結果分配給第th 欄位 ( ),它是包含目前記錄中欄位數的特殊變數,並且是檢索欄位內容(或帶有 的完整記錄)的運算符。-1``strftime()``t``%A``NF``$NF``NF``$``$ 0
    • 第二個 ( 1) 缺少預設為(列印目前記錄)的操作部分,並且**條件( ) 始終為真。這是無條件列印目前記錄的慣用簡短方法,如果您想要更詳細,您可以這樣做:{print}``1
    gawk -i inplace \
         -v FS=, \
         -v OFS=, \
         -v date_field=4 \
         -v current_record=0 \
         -v always=1 '
      {
        date_for_mktime = gensub("-", " ", "g", $date_field) " 0 0 0"
        unix_time = mktime(date_for_mktime)
      } 
      unix_time > 0 {
        $NF = strftime("%A", unix_time)
      }
      always {print $current_record}' your-file
    

如果您希望工作日名稱始終為英文而不管使用者的區域設置,您可以將區域設置固定為C( LC_ALL=C gawk...)。

引用自:https://unix.stackexchange.com/questions/550882