如何使用AWK逆转字段顺序?

时间:2010-08-01 11:16:52

标签: linux unix awk

我有一个包含以下布局的文件:

123,01-08-2006
124,01-09-2007
125,01-10-2009
126,01-12-2010

如何使用AWK将其转换为以下内容?

123,2006-08-01
124,2007-09-01
125,2009-10-01
126,2009-12-01

4 个答案:

答案 0 :(得分:3)

第一次没有正确阅读问题。您需要一个字段分隔符,可以是短划线或逗号。一旦你有了,你可以使用短划线作为输出字段分隔符(因为它是最常见的)并使用连接伪造逗号:

awk -F',|-' 'OFS="-" {print $1 "," $4,$3,$2}' file

答案 1 :(得分:2)

Pure awk

awk -F"," '{ n=split($2,b,"-");$2=b[3]"-"b[2]"-"b[1];$i=$1","$2 } 1' file

SED

sed -r 's/(^.[^,]*,)([0-9]{2})-([0-9]{2})-([0-9]{4})/\1\4-\3-\2/' file
sed 's/\(^.[^,]*,\)\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9]\+\)/\1\4-\3-\2/' file

#!/bin/bash

while IFS="," read -r a b
do
  IFS="-"
  set -- $b
  echo "$a,$3-$2-$1"
done <"file"

答案 2 :(得分:1)

不幸的是,我认为标准awk只允许一个字段分隔符,因此您必须预处理数据。您可以使用tr执行此操作,但如果您确实需要仅awk解决方案,请使用:

pax> echo '123,01-08-2006
124,01-09-2007
125,01-10-2009
126,01-12-2010' | awk -F, '{print $1"-"$2}' | awk -F- '{print $1","$4"-"$3"-"$2}'

输出:

123,2006-08-01
124,2007-09-01
125,2009-10-01
126,2010-12-01

根据需要。

第一个awk,个字符更改为-,以便您将四个字段分隔为相同的字符(这是我通常使用的位tr ',' '-'对)。

第二个awk按照您指定的顺序打印出来,同时更正字段分隔符。

如果您使用的awk实现允许多个FS字符,则可以使用以下内容:

gawk -F ',|-' '{print $1","$4"-"$3"-"$2}'

答案 3 :(得分:0)

如果它不需要是awk,你也可以使用Perl:

$ perl -nle 'print "$1,$4-$3-$2" while (/(\d{3}),(\d{2})-(\d{2})-(\d{4})\s*/g)' < file.txt