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. #1
    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 Remplacer une colonne par ses numéros correspondants dans une liste
    Bonjour,
    J'ai un fichier My_file à 3 colonnes:
    col1: de 1 à 8, col2: de 9 à 17,col3:de 18 à 48
    (Typiquement: Nom, Prénom, Adresse)
    Je cherche à avoir 2 fichiers : $Adr_file contenant la liste des adresses avec des numeros (Ids), et $Id_Adr_file contenant Nom, Prénom, et le Numéro (Id) correspondant.

    Ce code marche à merveille, sauf que ça prend beacoup de temps(45 min) pour 17000 lignes
    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
    36
    37
    38
    39
    40
    41
     
    awk ' {var1=substr($0,17,30);
    	printf("%s",var1)
    	printf( "\n" )
    } ' $My_file > TEMP1
     
    # remove duplicates
    sort -o $Adr_file TEMP1
    uniq $Adr_file > TEMP
     
    if [ -f TEMP2 ]
    then
    	rm TEMP2
    fi
     
    #Cette partie est celle qui consomme beacoup de temps
    while read line
    do
    adresse=`expr substr "$line" 17 30`
    p_id=`grep -x -n "$adresse" TEMP | cut -f1 -d ":"`
     
    printf "%-3s %s" $p_id >> TEMP2 
    echo $line >> TEMP2
     
    done < $My_file
     
    if [ -f $Adr_file ]
    then
    	rm $Adr_file
    fi
     
    i=1
    while read line
    do
    printf "%-3s %s" $i>> $Adr_file 
    echo $line >> $Adr_file
    i=$(expr $i + 1 )
    done < TEMP
     
    #ce awk file va simplement virer la colonne adresses du fichier final
    awk -f adresse.awk TEMP2 > $Id_Adr_file
    Quelqu'un a une idée pour améliorer la logique??

    Merci

  2. #2
    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
    Je me rends compte que j'ai peut etre posé le problème d'une mauvaise façon.

    Si j'ai une liste (non triée) de strings :

    Barry
    Adrien
    John
    Barry
    Adrien
    Barry
    John

    Je veux numéroter cette liste ainsi:
    1 Adrien
    1 Adrien
    2 Barry
    2 Barry
    2 Barry
    3 John
    3 John

    puis revenir à l'ordre initial :
    2 Barry
    1 Adrien
    3 John
    2 Barry
    1 Adrien
    2 Barry
    3 John


    Cela résoudrait mon problème je pense par un simple awk script derrière

    J'apprécierai tous les tuyaux, merci

  3. #3
    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
    Des idées ??

    Est ce si difficile que ça ?

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Salut freestyler,

    suis en train de voir ( sur tout le code ) ..

    Si je comprends bien, ton fichier My_file ( contient 3 champs concaténés et sans espace reprenant le nom prenom et adresse. )

    Question simple les champs ID des fichiers representés par $Adr_file et $Id_Adr_file n'ont aucun rapport ?? ( dumoins je ne crois pas ) .. petite question afin de ne pas partir sur quelques chose de faux ..

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par freestyler Voir le message
    Bonjour,
    J'ai un fichier My_file à 3 colonnes:
    col1: de 1 à 8, col2: de 9 à 17,col3:de 18 à 48
    (Typiquement: Nom, Prénom, Adresse)
    Je cherche à avoir 2 fichiers : $Adr_file contenant la liste des adresses avec des numeros (Ids), et $Id_Adr_file contenant Nom, Prénom, et le Numéro (Id) correspondant.

    Ce code marche à merveille, sauf que ça prend beacoup de temps(45 min) pour 17000 lignes
    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
    36
    37
    38
    39
    40
    41
     
    awk ' {var1=substr($0,17,30);
    	printf("%s",var1)
    	printf( "\n" )
    } ' $My_file > TEMP1
     
    # remove duplicates
    sort -o $Adr_file TEMP1
    uniq $Adr_file > TEMP
     
    if [ -f TEMP2 ]
    then
    	rm TEMP2
    fi
     
    #Cette partie est celle qui consomme beacoup de temps
    while read line
    do
    adresse=`expr substr "$line" 17 30`
    p_id=`grep -x -n "$adresse" TEMP | cut -f1 -d ":"`
     
    printf "%-3s %s" $p_id >> TEMP2 
    echo $line >> TEMP2
     
    done < $My_file
     
    if [ -f $Adr_file ]
    then
    	rm $Adr_file
    fi
     
    i=1
    while read line
    do
    printf "%-3s %s" $i>> $Adr_file 
    echo $line >> $Adr_file
    i=$(expr $i + 1 )
    done < TEMP
     
    #ce awk file va simplement virer la colonne adresses du fichier final
    awk -f adresse.awk TEMP2 > $Id_Adr_file
    Quelqu'un a une idée pour améliorer la logique??

    Merci
    deja tu fais un expr avec substr meiux vaut remplacer ça par une seule commande sed
    de meme pour le grep + cut

    et n'oublies pas pour sed
    s/$toto/titi/
    /$toto/s/$toto/titi/ sont la même chose mais le second indexe avant action ce qui le rend hyper performant.

    un exemple d'utilisation de sed pour un cas comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/'$toto'/s/'$toto':.*/'$toto'/' fichier > newfile
    ce qui = à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep $toto fichier | cut -d":" -f1 > newfile
    de read est à exclure aussi pour le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for truc in $( cat fichier) 
    do
    ...
    done
    de plus tu as 2 fois read dans ton script


    et bien sur le plus grave de tout
    remplaces ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adresse=`expr substr "$line" 17 30`
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    adresse=$(echo $line | cut -c 18-30)
    #pour une fois qu'on peut utiliser le cut plus vite que l'expr faut le faire :)
    tu devrais rien qu'avec ça, sans même toucher à l'algo, descendre vers les 35/40 minutes si tu dis que tu tournes actuellement en ~45~minutes.

    si tu veux descendre encore plus bas là il faut "casser" l'algo et voir si on peut faire mieux, et/ou changer de shell à awk ou a autre chose.

  6. #6
    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
    Suivant ton fichier exemple, que donne un timing de ceci:
    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
    #!/bin/bash
     
    FICHIER=$1
     
    # numérotation des lignes
    cat -n $FICHIER | sort -k2 > /tmp/${FICHIER}-apres-tri
     
    # affectation numérotation perso 
    awk 'BEGIN {
            previous = ""
            n=0
    }
     
    {        
        if ( $2 != previous) {
            n++
        }
        print n, $1, $2
        previous = $2
    }
    ' /tmp/${FICHIER}-apres-tri  | sort -k2 | cut -d' ' -f1,3
    Appeler le script:
    $ script.sh <nom-du-fichier-a-traiter>
    :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

  7. #7
    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
    merci a tous pour vos réponses

    Cependant, j'ai quelques remarques à ajouter :

    tuxoin: L'idée est d'avoir une correspondance entre les Ids de $Adr_file et $Id_Adr_file. donc c'est effectivement les mêmes. Tout le challenge est de remplacer une colonne par l'Id correspondant dans une liste!
    1 adresse1
    2 adresse2
    3 adresse3
    ...
    puis dans $Adr_file, remplacer adresse1 par 1, adresse2 par2, ..sachant que le champ adresse se situe TOUJOURS à la colonne 17 de $My_file et que nom se situe toujours au début et prend TOUJOURS 8 caractéres, et que prénom suit nom sur 8 caractéres aussi
    donc : (n pour non, p pour prenom, a pour adresse)
    nnnnnnnnppppppppaaaaaaaaaaaaaaaaaa..
    n prend un espace si length(nom) < 8 .. ainsi de suite

    frp31:
    le for line in $(cat fichier) n'est pas adapté.
    comment faire sir j'ai des espaces dans $line ??
    sinon, je ne suis pas pro sed j'ai jamais bien saisi son fonctionnement. donc je ne sais pas amélirer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    adresse=$(echo $line | cut -c 18-30)
    adr_id=`grep -x -n "$adresse" TEMP | cut -f1 -d ":"`
    si tu penses que ca va améliorer mes performances en temps, merci de me dire comment faire en sed (le grep -x c'est pour avoir un match de toute la ligne car il se peut que j'ai dans ma liste des adresses comme Paris, Paris-sud et que pour des raisons evidentes, le grep sur paris donnera plusieurs matchs inutiles)

    ripat:
    je ne vois pas ou tu veux en venir ??
    tu essaies sur quel fichier exemple?
    sinon, cat -n ne marche pas !! mauvais usage


    Merci

  8. #8
    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
    ripat
    je commence à voir où tu veux en venir sauf que mom fichier exemple n'est pas exactement cà:

    20051023 3681FROMAGE
    20051023 48385VIANDE BOVINE
    20051023 48408VIANDE BOVINE
    20051023 79891CONSERVE 4
    20051023 79907VIANDE BOVINE
    20051023 90223VOLAILLE
    20051023 111652PATES
    20051023 350600VIANDE ROUGE
    20051023 551694VIANDE BOVINE
    20051023 1078954RIZ
    20051030 1111385CONSERVE 1
    20051030 1139501CONSERVE 1
    20051030 1167351CONSERVE 1
    20051030 1248173CONSERVE 4
    20051030 1248197CONSERVE 4

    voici les 15 premiéres lignes de mon fichier
    colonne 1 = JOUR (8 caracteres)
    colonne 2 = ARTICLE (8 caracteres)
    colonne 3 = CATEGORIE (end of line)
    j'ai pas pu effectuer le tri sur la colonne 17 (debut de categorie) a cause des espaces.

    merci d'adapter ton bout de code, je pense que c'est exactement ce que je veux.

    sinon, pour rendre les choses plus évidentes pour tout le monde, je cherche a obtenir à partir de ça:
    Liste1
    ------
    1 CONSERVE 1
    2 CONSERVE 4
    3 FROMAGE
    4 PATES
    5 RIZ
    6 VIANDE BOVINE
    7 VIANDE ROUGE
    8 VOLAILLE

    puis. Liste 2
    ------------
    20051023 3681 3
    20051023 48385 6
    20051023 48408 6
    20051023 79891 2
    20051023 79907 6
    20051023 90223 8
    20051023 111652 4
    20051023 350600 7
    20051023 551694 6
    20051023 1078954 5
    20051030 1111385 1
    20051030 1139501 1
    20051030 1167351 1
    20051030 1248173 2
    20051030 1248197 2

    Les espaces sont trompeurs, mais col1(8: se termine à la colonne 8), col2(8: se termine à la colonne 16), col3 (4: se termine à la colonne 20) : se termine c'est à dire justifié à droite (col3=" 1", " 2" par ex)

  9. #9
    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
    Je vois mieux. Il y a d'abord un travail de séparation à faire dans le champs "categorie". Je regarde ça. Mais je t'annonce dès à présent que le traitement final ne devrait pas prendre plus de quelques secondes. Sauf si tu l'exécutes sur un 386 avec 512K de ram.

    D'après ton msg précédent, les colonnes n'ont pas de position fixe contrairement à ce que tu sembles dire. Mets nous ton fichier tel qu'il apparaît avec un cat. Y compris les espaces. Utilise les balises "CODE" de l'éditeur de message pour conserver les espaces.
    :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

  10. #10
    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
    j arrive pas à faire un bon copier -coller

    mais les colonnes ont une position fixe, sauf que c'est justifié à droite
    par exemple:
    20051023 3681FROMAGE
    1111111122222222333333333333...

    11111111="20051023"
    22222222=" 3681" (je compléte par 4 espaces avant)
    33333333... = "FROMAGE"
    Fichiers attachés Fichiers attachés

  11. #11
    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
    Citation Envoyé par freestyler Voir le message
    Les espaces sont trompeurs, mais col1(8: se termine à la colonne 8), col2(8: se termine à la colonne 16), col3 (4: se termine à la colonne 20) : se termine c'est à dire justifié à droite (col3=" 1", " 2" par ex)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             1         2         3
    123456789012345678901234567890
    20051023 3681FROMAGE
    20051023 48385VIANDE BOVINE
    20051023 48408VIANDE BOVINE
    20051023 79891CONSERVE 4
    20051023 79907VIANDE BOVINE
    20051023 90223VOLAILLE
    20051023 111652PATES
    20051023 350600VIANDE ROUGE
    20051023 551694VIANDE BOVINE
    La colonne 3 ne commence pas toujours au même endroit. Faut-il "splitter" la colonne qui va de 10 à la fin de ligne?
    :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

  12. #12
    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
    Nos messages se sont croisés. J'ai jeté un oeil sur ton fichier txt. Je regarde ça. A titre d'info, tu aurais pu utiliser les balises CODE qui affiche des espacements proportionnels. C'est le signe # de l'éditeur de messages.
    :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

  13. #13
    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
    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
     
    20051023    3681FROMAGE
    20051023   48385VIANDE BOVINE
    20051023   48408VIANDE BOVINE
    20051023   79891CONSERVE 4
    20051023   79907VIANDE BOVINE
    20051023   90223VOLAILLE
    20051023  111652PATES
    20051023  350600VIANDE ROUGE
    20051023  551694VIANDE BOVINE
    20051023 1078954RIZ
    20051030 1111385CONSERVE 1
    20051030 1139501CONSERVE 1
    20051030 1167351CONSERVE 1
    20051030 1248173CONSERVE 4
    20051030 1248197CONSERVE 4
    cool

  14. #14
    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
    Un peu de chipotage mais on y arrive je crois.

    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
    #!/bin/bash
     
    FICHIER=$1
     
    # split de la col. 3 en deux champs
    # Remplacement de espace dans nom de produit par _ (pour tri plus bas)
    # pipé dans un cat qui rajoute un n° de séquence
    # pipé dans un sort sur le champ 4
    sed -r 's/([0-9]+)([A-Z])/\1 \2/; s/([A-Z]+) /\1_/' $FICHIER \
    | cat -n | sort -k4 > /tmp/${FICHIER}-apres-tri
     
    # affectation numérotation perso 
    awk 'BEGIN {
            previous = ""
                    n=0
    }
     
    {        
            if ( $4 != previous) {
                    n++
            }
            print $1, $2, $3, n 
            previous = $4
    }
    ' /tmp/${FICHIER}-apres-tri  | sort -nk1  | cut -d' ' -f2,3,4
    Il me semble qu'il y a des retour ligne Windows \r\n dans ton fichier. J'ai testé sans.
    :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

  15. #15
    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
    Usage: cat [-su] [-v[et]] [file ...]
    sed: Unknown option -r
    Usage: sed [-n] script [file...]
    sed [-nE] [-e script] [-f scriptfile] [file...]

    le cat -n comme je t'ai dit ne marche pas
    ni le sed -r d'ailleurs..

    pourquoi ca ne pose pas de problémes sur ta machine? et comment y remédier?

    merci

  16. #16
    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
    je fais une recherche sur le Net/

    sed -r n'est pas standard

    cat -n non plus (grep -n "" semble bien marcher)

    Comment faire sans pour le sed -r? j'ai essayé /regexp/ en vain..

    merci (je suis bloqué)

  17. #17
    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
    Quelle version de coreutils as-tu? Il me semblait que cat -n existait dans toutes les distro, mais bon...

    Pour le sed, ta version ne supporte apparemment pas les expressions régulières "extended". Pas grave, le masque est juste un peu moins lisible c'est tout.

    Remplace le début du script par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FICHIER=$1
    NBR_LIGNES=$(wc -l ${FICHIER} | cut -d' ' -f1)
     
    # construction d'un fichier contenant les n° de séquence (seq)
    # Ajout d'un N° de séquence par paste
    # split de la col. 3 en deux champs
    # Remplacement de espace dans nom de produit par _ (pour tri plus bas)
    # pipé dans un sort sur le champ 4
    seq $NBR_LIGNES > /tmp/seq
    paste /tmp/seq $FICHIER | sed 's#\([0-9]\+\)\([A-Z]\)#\1 \2#; s#\([A-Z]\+\) #\1_#' \
    | sort -k4 > /tmp/${FICHIER}-apres-tri
    :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

  18. #18
    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, le seq non plus ne marche pas ..

    J'ai pu adapter le code ainsi:
    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
     
    Fichier=My_files.txt
    sed -E 's/([0-9]+)([A-Z])/\1 \2/; s/([A-Z]+) /\1_/' $FICHIER \
    | grep -n "" | sort -k4 > apres-tri.dat
     
    cat apres-tri.dat | awk -F":" '{print $2}' > tri.dat
     
    # affectation numérotation perso 
    awk 'BEGIN {
            previous = ""
                    n=0
    }
     
    {        
            if ( $3 != previous) {
                    n++
            }
     
    		while (length(n) < 4)
    		n = " "n
     
            print n, $1, $2
            previous = $3
    }
    ' tri.dat  | sort -nk2  > apres-tri.dat
     
     awk -f 1.awk apres-tri.dat > Result1.dat
    1.awk
    ------
    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
     
     
    function trim( inStr ) 								
    { 									
    e = match( inStr, /[ ]*$/ ) 									
    if ( e > 0 ) { return substr( inStr, 1, e-1 ) } 						
    else { return inStr } 								
    } 									
     
    { 									
    Id = substr( $0 , 1 , 4 ) 								
    day = substr( $0 , 6 , 8 ) 								
    article = substr( $0 , 15 , 8 )									
     
    #ajouter espaces pour avoir 8 cacartères exactement justifiés à droite
    article = trim(article)
    while (length(article) < 8)
    	article = " "article
     
    printf("%s", day )
    printf("%s", article )
    printf("%s",Id)
     
    printf("\n")			
    }
    Ceci me génére exactement ce que je veux.. EXACTEMENT

    PROBLEME:
    quand catégorie contient plusieurs espaces (Viande de chèvre, lait de noix de coco, ...) Je n'ai pas pu adapter ton code.

  19. #19
    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
    Pour les espaces, change cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -E 's/([0-9]+)([A-Z])/\1 \2/; s/([A-Z]) ([A-Z])/\1_\2/g' $FICHIER \
    | grep -n "" | sort -k4 > apres-tri.dat
    Pour le reste, c'est un peu dommage de repasser ton fichier à la moulinette de awk pour la sortie finale. Un cut ne marcherait pas?

    Et côté timing, qu'est-ce que ça donne?
    :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

  20. #20
    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 ca ne marche pas..
    d'ailleurs c'est pire :-)


    t'as essayé? Ca ne couvre même pas les premiers espaces


    en plus je dois gérer tout type d'exceptions:
    lait-de-poule
    lait - de - poule
    lait /de/chevre
    lat & de & chevre

    ....

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 12h46
  2. Réponses: 3
    Dernier message: 27/07/2012, 12h25
  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, 02h30
  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, 22h55
  5. Réponses: 3
    Dernier message: 01/06/2009, 19h21

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