使用 awk 或 sed 重新排列一列中的值而不影响其他列

使用 awk 或 sed 重新排列一列中的值而不影响其他列

我有一个以下格式的 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

相关内容