IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacer une colonne par ses numéros correspondants dans une liste


Sujet :

Shell et commandes GNU

  1. #21
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Complète les classes de caractères du masque de regex de sed pour tenir compte des cas particuliers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '12 225 225 VIANDE /de /PORC & DE VOLAILLE' | sed -r 's#([A-Z/&-]*) ([A-Z0-9/&-])#\1_\2#gi'
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  2. #22
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Bon finalement j'ai fait un truc à ma sauce mais qui y ressemble beaucoup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    awk ' {var1=substr($0,17,30);
    	printf("%s",var1)
    	printf( "\n" )
    } ' $FICHIER > TEMP
     
    sort -u TEMP | grep -n "" | awk -F":" '{ printf ("%4s", $1) ; printf ("%40s", $2) ; printf ("\n")}' > $FICHIER _CATEGORIES_AND_IDs
     
    sed -E 's/ /?/g' TEMP > TEMP1
     
    grep -n "" TEMP1| awk -F":" '{ printf ("%6s", $1) ; printf (" "); printf ($2) ; printf ("\n")}' | sort -nk2 > TEMP2
     
    awk 'BEGIN {
            previous = ""
                    n=0
    }
    {        
            if ( $2 != previous) {
                    n++
            }	
     
            print $1, $2, n
            previous = $2
    } ' TEMP2 | sort -nk1 > TEMP3
     
    awk -F" " '{printf("%8s", "CAT_"$3); printf ("\n")}' TEMP3 > TEMP4
     
    awk ' {var1=substr($0,1,16);
    	printf("%s",var1)
    	printf( "\n" )
    } ' $FICHIER > TEMP5
     
    paste -d "" TEMP4 TEMP5 > $FICHIER_CONVERTI
     
    rm TEMP TEMP1 TEMP2 TEMP3 TEMP4 TEMP5

    c'est super rapide, et super efficace (et merci tu m'as forcé à apprendre awk)



    sinon, j'ai un autre souci..
    Comme mon fichier principal contient des dates, je veux récupérer l'information date_début et date_fin dans mon $FICHIER _CATEGORIES_AND_IDs

    sachant que j'ai comme input un truc du genre : (Numero, DATE, ARTICLE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1 20070121 6429594
    1 20070128 6429540
    1 20070128 6429594
    2 20060101 6003125
    2 20060108 6003125
    2 20070128 6003125
    3 20051023 2231044
    3 20051023 2469966
    3 20051030 2231044
    3 20051030 2469966
    comment récupérer un output du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 20070121 20070128 
    2 20060101 20070128
    3 20051023 20051030
    Vous l'aurez compris : 1er et dernier enregistrement date de chaque nombre.

    c'est de l'awk je suis sur mais je sais pas comment faire (pas encore du moins)

    Merci

  3. #23
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    NR == 1 {
            id = $1
            dtemin = dtemax = $2
    }
     
    {
            if ($1 == id) {
                    if ($2 > dtemax){dtemax = $2}
                    if ($2 < dtemin){dtemin = $2}
            } else {
                    print  id, dtemin, dtemax
                    id = $1
                    dtemin = dtemax = $2
            }
    }
     
    END {
            print  id, dtemin, dtemax
    }
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  4. #24
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    c'est un awk script c ca? (car je ne comprends pas ce que NR == 1 veut dire)

    Si c'est bien un awk script (auquel cas j'ajoute le mot clé awk), ça ne marche pas. Tout ce que le script fait, c'est générer un fichier contenant le premier enregistrement et le dernier enregistrement - le dernier étant un peu modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1 20070121 6429594
    1 20070128 6429540
    1 20070128 6429594
    2 20060101 6003125
    2 20060108 6003125
    2 20070128 6003125
    3 20051023 2231044
    3 20051023 2469966
    3 20051030 2231044
    3 20051030 2469966
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 20070121 6429594
    3 20051030 20051030

  5. #25
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    C'est effectivement un script awk. Tu peux l'invoquer de plusieurs manières
    1. tu mets le code tel quel dans un fichier et:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $ awk -f script-awk ton_fichier_a_traiter
    2. tu lui donne un shebang awk:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      #!/usr/bin/awk -f
       
      NR == 1
       
      etc....
      tu le chmod +x et tu l'invoques:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $ ./script-awk ton_fichier_a_traiter
    3. Tu l'intègres dans un script bash comme tu l'as fait plus haut.
    4. Tu pourrais aussi le "sourcer" mais cette une subtilité inutile ici.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    NR == 1
    # si le Current Record Number (NR) est égal à 1, la première ligne
    {
        exécuter ceci
    }
    Mon script marche parfaitement chez moi avec l'exemple que tu as donné.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  6. #26
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Desolé mais ça ne marche toujours pas.

    J'ai loopé un truc?

    je crois que j'ai tout essayé avec ton code mais au mieux il me génère ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1 20070121 20070121
    1 20070128 20070128
    1 20070128 20070128
    2 20060101 20060101
    2 20060108 20060108
    2 20070128 20070128
    3 20051023 20051023
    3 20051023 20051023
    3 20051030 20051030
    3 20051030 20051030

  7. #27
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Ton fichier de base n'aurait-il pas ces foutus retours ligne Windows par hasard?

    Si c'est le cas: rajoute ceci au début du script awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # RS: Record Separator
    BEGIN {
            RS="\r\n"
    }
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  8. #28
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Non..
    et donc ca ne marche toujours pas..

    j'ai opté pour un truc en python..
    Dommage que ça n'ait pas abouti

    Merci quand meme

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 11h46
  2. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  3. [WD-2010] Remplacer un mot par le même MAIS dans une autre couleur
    Par goldvin dans le forum Word
    Réponses: 4
    Dernier message: 16/01/2012, 01h30
  4. Acceder à une colonne par son numéro
    Par michelp38 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2011, 21h55
  5. Réponses: 3
    Dernier message: 01/06/2009, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo