Deplacer une colonne /un champ

Utilisateur anonyme -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

j'ai un fichier (nom_fichier) avec 12 champs (colonnes) qui sont separés par ":" comme suit:

N° idi nom prenom cp ville age sexe salaire N°lot montant nom entreprise type

14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF : individuel
21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF : collectif

et en fait je veux deplacer le champ N°11 et le mettre en premeir :

nom entreprise : N° idi : nom : prenom : cp : ville : age : sexe : salaire : N°lot : montant : type

EDF : 14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : individuel
SNCF : 21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : collectif

comment faire? j'ai trouvé 2 formules en cherchant sur internet mais sa na pas marché:

$ awk '{ print $11" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$12 }' nom_fichier
$ awk -F: -v OFS \u003d, '(print 11 $, 1 $,2 $, 3 $, 4 $, 5 $, 6 $, 7 $, 8 $, 9 $, 10 $, 12 $)' ==> je ne sais meme pas c'est quoi "OFS" et "u003d" ???

merci de m'aider !!
Configuration: Windows XP / Internet Explorer 7.0

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    OFS - OutputFieldSeparator
    U+003d
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Essaie

    ~$ cat adresse 
    14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF : individuel
    21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF : collectif 
    ~$ awk -F" *: *" '{printf "%s : ",$11 ; for(i=1;i<11;++i)printf "%s : ",$i};{print $12}' adresse
    EDF : 14528723 : lucot : jack : 75000 : paris : 30 : male : 35000 : 2 : 215800 : individuel
    SNCF : 21598332 : xavier : francine : 75015 : paris : 25 : femele : 25000 : 3 : 50000 : collectif 

    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    autre variante avec awk
    $ cat a2
    14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF : individuel
    21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF : collectif
    $ awk 'BEGIN{FS=OFS=":"};{x=$11;$11="";sub("::",":");print x, $0}' < a2
     EDF :14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : individuel
     SNCF :21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : collectif
    $ 
    
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Plus élégante, cette variante ;-)

      Je ne suis pas encore très rodé avec awk ;-)
      Avec perl j'aurais fait comme ça

      :~$ cat adresse
      14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF : individuel
      21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF : collectif 
      ~$ perl -pe 's/((?:.*?\s*:\s*){10})(.*:)(.*)/$2$1$3/' adresse
      EDF :14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 :  individuel
      SNCF :21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 :  collectif 



      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    j'ai essayé avec sed, mais je ne comprends pas pourquoi ça marche
    $ cat a2
    14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF : individuel
    21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF : collectif
    $ 
    $ sed 's/\(.*:\)\(.*:\)/\2\1/' a2
     EDF :14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : individuel
     SNCF :21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : collectif
    
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      La 1ère capture avale tout, ensuite sous contrainte la regex doit céder au moins un : (la 2ème capture)

      Comme .* de la 2ème capture est aussi gourmande, va prendre tout entre l'avant dernier : et le dernier : (la pos 11) mais ce que se trouve après le dernier : n'est pas pris en compte

      Si tu avais un : à la fin tu aurais obtenu ceci

      :~$ sed 's/\(.*:\)\(.*:\)/\2\1/' a3
       individuel:14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 : EDF :
       collectif:21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 : SNCF :


      Pour éliminer l'espace au début de 1er champ

      :~$ sed 's/\(.*: *\)\(.*:\)/\2\1/' a2
      EDF :14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 :  individuel
      SNCF :21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 :  collectif



      P.S. Vu qu'il a demandé le champs 11 je suis parti pour le groupement des 10 premiers sans trop me pencher sur le problème, mais en fait tu as raison il aurait fallu profiter de la gourmandise tout simplement

      :~$ perl -pe 's/(.*\s*:\s*)(.*:)/$2$1/' a2
      EDF :14528723 : lucot : jack : 75000 : paris : 30: male :35000 : 2 : 215800 :  individuel
      SNCF :21598332 : xavier : francine: 75015 : paris : 25 : femele :25000 :3 :50000 :  collectif


      0