Awk

在 macOS 上使用 awk/gawk 轉換日期格式

  • July 13, 2022

我有數百萬行數據,我的老闆要求我為它們重新格式化。

格式為:

06/28/2022,04:00,142.01,142.38,141.59,142.15,3151
06/28/2022,04:01,142.1,142.1,142.1,142.1,196

我需要將第一個日期欄位重新格式化為:

20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

%Y%m%d

我有以下內容:

gawk -F"," '{OFS=","; $1=strftime("%Y%m%d", $1); print $0}' AAPL.txt > AAPL.csv

但奇怪的是它有效,但產生的日期是 1969 年。

19691231,04:00,142.01,142.38,141.59,142.15,3151
19691231,04:01,142.1,142.1,142.1,142.1,196

我不明白為什麼。我選擇gawk是因為awk在 MacOS 上沒有,strftime並且在外部呼叫會date產生巨大的性能影響。

您的程式碼沒有按照您的期望執行,因為 GNUawk strftime()期望將 Unix 時間戳作為其第二個參數。它無法解析任意日期時間字元串。

但是,我們在這裡並不需要strftime()

$ awk -F , 'BEGIN { OFS=FS } { split($1,a,"/"); $1 = a[3] a[1] a[2] }; 1' file
20220628,04:00,142.01,142.38,141.59,142.15,3151
20220628,04:01,142.1,142.1,142.1,142.1,196

這將每一行輸入視為簡單的逗號分隔欄位,並將第一個這樣的欄位拆分/為數組a。然後將第一個欄位重新形成為以所需順序連接的數組元素。

1程式碼末尾的單獨awk導致輸出修改的記錄。

這適用awk於 macOS 上的預設設置。它不需要特殊的日期格式化函式,因為它將輸入日期視為字元串並簡單地對其進行重組。關於日期的唯一假設是它始終採用DD/MM/YYYY輸入格式,並且應該採用YYYYMMDD輸出格式。

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