Ubuntu
尋找一種將星期幾附加到行尾的方法
在 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 tot
) 返回的值是否大於 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...
)。