2010-08-01 64 views
4

我有以下布局的文件:如何使用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 
+0

我改写了你的问题,并决定改变的“反向串”的措辞。你所做的不是颠倒一个字符串,而是颠倒由非单词字符分隔的字段顺序。如果我错误地猜测了你的目标,请随意提出一个更好的措辞。 – 2010-08-01 11:29:41

+1

[优雅的方式颠倒列顺序](https://stackoverflow.com/questions/1227986/elegant-way-to-reverse-column-order) – 2017-05-30 08:28:16

回答

2

纯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" 
+0

您好,我在执行时遇到以下错误 “ sed:非法选项-r“ – user400480 2010-08-01 11:35:31

2

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

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

他想重新排序日期字段 – ghostdog74 2010-08-01 11:40:47

+0

好点。在编辑中修复。 – Amoss 2010-08-01 11:51:56

0

如果它不需要被awk中,你可以使用Perl太:

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