我有一个以下格式的 csv 文件:
abc,124,123,2014-08-13,abc
def,124,123,2014-08-13,abc
ghi,124,123,2014-08-13,abc
现在我只需要修改第五列 ( 2014-08-13
) 即可生成如下所示的输出
abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc
如果可能的话,首选一种衬垫awk
或解决方案。sed
答案1
解决方案awk
:
awk -F'[,-]' '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}' file
解释:
-F'[,-]
: 将分隔符设置为,
or-
'{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}'
:按所需顺序打印该部分,并在末尾打印换行符。
以及一个sed
解决方案:
sed 's|\([0-9]*\)-\([0-9]*\)-\([0-9]*\)|\3/\2/\1|g' file
解释:
\([0-9]*\)-\([0-9]*\)-\([0-9]*\)
:搜索digits-dash-digits-dash-digits(将数字保存在子模式\1
、\2
和 中\3
)\3/\2/\1
并将它们以相反的顺序替换为/
中间的。
答案2
Perl解决方案:
perl -aF'[,-]' -ne 'print join ",", @F[0..2], join("/", @F[5,4,3]), $F[6]' < input
答案3
和sed
:
$ sed -e 's#\([0-9]\{1,\}\)-\([0-9]\{1,\}\)-\([0-9]\{1,\}\)#\3/\2/\1#' file
abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc
如果您有 GNU 或 FreeBSD sed
,您可以使用:
sed -E 's#([0-9]+)-([0-9]+)-([0-9]+)#\3/\2/\1#' file
或者perl
:
perl -pe 's#(\d+)-(\d+)-(\d+)#$3/$2/$1#'
答案4
Awk 解决方案
awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file