2010-08-01 7 views
4

Je dispose d'un fichier avec la mise en page suivante:Comment inverser l'ordre des champs en utilisant AWK?

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

Comment puis-je convertir dans les éléments suivants en utilisant AWK?

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

Je reformulé votre question, et a décidé de modifier libellé de « reverse une chaîne ». Ce que vous faites n'est pas inverser une chaîne, mais inverser l'ordre des champs, séparés par des caractères non-mot. N'hésitez pas à proposer une meilleure formulation si je devine quel est votre but incorrectement. –

+1

Possible duplication de [manière élégante d'inverser l'ordre des colonnes] (https://stackoverflow.com/questions/1227986/elegant-way-to-reverse-column-order) –

Répondre

2

awk pur

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 

Bash

#!/bin/bash 

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

Salut, je reçois l'erreur ci-dessous lors de l'exécution " sed: option illégale - r " – user400480

2

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 tableau de bord comme séparateur de champ de sortie (comme il est le plus courant) et faux la virgule en utilisant la concaténation:

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

il veut réorganiser le champ de date – ghostdog74

+0

Bon point. Fixé dans l'édition. – Amoss

0

Si elle n'a pas besoin d'être awk, vous pouvez utiliser Perl trop :

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

Malheureusement, je pense que la norme awk ne permet qu'un séparateur de champ afin que vous devrez pré-traiter les données. Vous pouvez le faire avec tr mais si vous voulez vraiment une solution awk -Seulement, 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}' 

Ce sorties:

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

comme on le souhaite.

La première awk modifie les caractères , à - de sorte que vous avez quatre champs séparés par le même caractère (ce qui est le bit j'utilise habituellement pour tr ',' '-').

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

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

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