Awk
在 CSV 上就地轉換列
我需要一些有關在 CSV 上就地轉換日期的幫助。基本上,我能夠轉換列並保存在新文件中,但我無法將其保存在原始 CSV 中。
我有一個日期格式的 CSV,
DD/MM/YYYY HH:MM
我想轉換為YYYY-MM-DD HH:MM
,它是我的 CSV 的第一列。我的 CSV 文件有這樣的內容:
29/01/2018 14:07,payable,37159871,,30521316 29/01/2018 14:07,payable,37159872,,30521316 29/01/2018 14:07,payable,37159870,,30521316 29/01/2018 14:07,payable,37159869,,30521316 29/01/2018 14:07,payable,37159868,,30521316
我想要這樣的東西:
2018-01-29 14:07,payable,37159871,,30521316 2018-01-29 14:07,payable,37159872,,30521316 2018-01-29 14:07,payable,37159870,,30521316 2018-01-29 14:07,payable,37159869,,30521316 2018-01-29 14:07,payable,37159868,,30521316
我能做的:
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' /path/to/file.csv > test_file
所以現在我想知道如何將它保存回我的 CSV 文件中。
這種情況下的編輯非常簡單,我不會打擾 Awk。
使用 GNU Sed 很簡單:
sed -rie 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv
使用 BSD Sed,使用:
sed -Ei '' -e 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv
僅使用 POSIX 工具,它有點醜陋但並不可怕:
printf '%s\n' '%s/^\(..\)\/\(..\)\/\(....\)/\3-\2-\1/' x | ex file.csv
編輯:實際上,仔細查看POSIX 規範
ex
會發現(幾乎)可以使用任何分隔符,就像在 Sed 中一樣。所以:printf '%s\n' '%s_^\(..\)/\(..\)/\(....\)_\3-\2-\1_' x | ex file.csv
稍微好一點。