Comment inverser l’ordre des champs en utilisant AWK?

J’ai un fichier avec la disposition suivante:

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

Comment puis-je le convertir en ce qui suit en utilisant AWK?

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

N’a pas lu la question correctement la première fois. Vous avez besoin d’un séparateur de champ qui peut être un tiret ou une virgule. Une fois que vous avez que vous pouvez utiliser le tiret comme séparateur de champ de sortie (comme c’est le plus commun) et simuler la virgule en utilisant la concaténation:

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

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 

Frapper

 #!/bin/bash while IFS="," read -rab do IFS="-" set -- $b echo "$a,$3-$2-$1" done <"file" 

Malheureusement, je pense que awk standard n’autorise qu’un seul caractère séparateur de champs, ce qui vous oblige à pré-traiter les données. Vous pouvez le faire avec tr mais si vous voulez vraiment une solution awk -only, utilisez:

 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}' 

Cela produit:

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

comme voulu.

Le premier awk modifie les caractères, de manière à ce que vous ayez quatre champs séparés par le même caractère (c’est le bit que j’utilise habituellement tr ',' '-' pour).

Le second awk imprime dans l’ordre que vous avez spécifié, corrigeant les séparateurs de champs en même temps.

Si vous utilisez une implémentation awk qui autorise plusieurs caractères FS , vous pouvez utiliser quelque chose comme:

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

S’il n’a pas besoin d’être awk, vous pouvez également utiliser Perl:

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