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