Awk

在 CSV 上就地轉換列

  • January 30, 2018

我需要一些有關在 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

稍微好一點。

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