如何轉換文件中的日期格式

如何轉換文件中的日期格式

輸入檔:包含 3 列,其中第三列是DD-MMM-YYYY格式
範例資料中的日期:

1232,abdc, 02-Jan-2014
4534,kdafh, 20-Feb-2014
364,asjhdk, 11-Jul-2012

所需輸出:

1232,abdc, 2014-01-02
4534,kdafh, 2014-02-20
364,asjhdk, 2012-07-11

使用函數日期:date -d 20-DEC-2014 +%Y-%m-%d
使用 awk 指令給出錯誤
還有其他方法嗎?

答案1

使用 awk 的一個可能答案,假設輸入檔是 input-file.txt ,輸出檔是 output-file.txt :

awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d "$3" +%Y-%m-%d");}' input-file.txt > output-file.txt

答案2

使用磨坊主( mlr) 清理無標頭 CSV 輸入中過多的空格,然後重寫第三個欄位。透過使用strptime()時間格式字串解析給定日期%d-%b-%Y,然後使用格式字串重新格式化產生的 Unix 時間戳記strftime()%F您可以使用,例如%Y-%m-%d代替%F)來重寫第三個欄位:

mlr --csv -N \
    clean-whitespace then \
    put '$3 = strftime(strptime($3,"%d-%b-%Y"),"%F")' file

給定問題中的數據,這將輸出

1232,abdc,2014-01-02
4534,kdafh,2014-02-20
364,asjhdk,2012-07-11

如果您的資料在同一欄位中具有時間戳,您可以調整strptime()strftime()呼叫中使用的格式字串以滿足您的需求。

請參閱系統手冊,strftime以了解這些格式化字串的含義以及格式化日期和時間的選項。

答案3

假設你輸入的文字是這樣的:

1232,abdc, 02-Jan-2014 18:01:37</br> 
4534,kdafh, 20-Feb-2014 07:17:19</br>
364,asjhdk, 11-Jul-2012 23:20:30</br>

我的答案會變成:

cat input-file.txt | sed 's[</br>[[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

如果記錄位於一行上(輸入檔中 </br> 之後沒有新行,則它會是

cat input-file.txt | sed 's[</br>[\n[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

答案4

您不想建立一個新進程來為檔案的每一行執行 shell 和另一個命令,這將是非常低效的。使用基於輸入的 shell 解釋程式碼也是引入命令注入漏洞的一個秘訣。此外,該-d選項是非標準的。

在這裡,我將使用可以進行時間操作的文字處理工具,例如 perl:

perl -MTime::Piece -pe '
  s{\d+-\w+-\d+$}{Time::Piece->strptime($&, "%d-%b-%Y")->ymd}e
  ' < your-file

在那裡,我們匹配<digits>-<word-characters>-<digits>行末尾的 find ( $),將其解釋為<day>-<month-abbrev>-<year>並重新格式化為<yead>-<month>-<day>使用 perl 的核心 Time::Piece 模組。

相關內容