我有以下布局的文件:如何使用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
我有以下布局的文件:如何使用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
纯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"
您好,我在执行时遇到以下错误 “ sed:非法选项-r“ – user400480 2010-08-01 11:35:31
没读过问题正确的第一次。您需要一个字段分隔符,可以是短划线或逗号。一旦你有,你可以使用破折号作为输出字段分隔符(因为它是最常见的),并使用串联假逗号:
awk -F',|-' 'OFS="-" {print $1 "," $4,$3,$2}' file
他想重新排序日期字段 – ghostdog74 2010-08-01 11:40:47
好点。在编辑中修复。 – Amoss 2010-08-01 11:51:56
如果它不需要被awk中,你可以使用Perl太:
$ perl -nle 'print "$1,$4-$3-$2" while (/(\d{3}),(\d{2})-(\d{2})-(\d{4})\s*/g)' < file.txt
不幸的是,我认为标准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}'
我改写了你的问题,并决定改变的“反向串”的措辞。你所做的不是颠倒一个字符串,而是颠倒由非单词字符分隔的字段顺序。如果我错误地猜测了你的目标,请随意提出一个更好的措辞。 – 2010-08-01 11:29:41
[优雅的方式颠倒列顺序](https://stackoverflow.com/questions/1227986/elegant-way-to-reverse-column-order) – 2017-05-30 08:28:16