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 :

[algo] Répartition de colis


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut [algo] Répartition de colis
    Bonjour la communauté.

    Je galère depuis cette après-midi sur un algo.
    Je dois mettre en place un script sh pour écrire quelques lignes dans différents fichiers.
    Je m'explique, j'ai en entrée un fichier qui ressemble à celui-ci:
    NumArt NumCarton NumFichier(Attendu)
    ZZZ 88 1
    CCDE 88 1
    AZDSDS 454 2
    SDSEE 454 2
    AAZE 454 2
    TTGYH 65 2
    DFDF 874 3
    ARFFF 874 3
    TRUCC 21 3
    TOUCK 21 3

    Le fichier contient des numéros d'articles avec leurs numéros de cartons. La dernière colonne contient le numéro de fichier dans lequel on écrit ces articles.
    L'objectif est d'écrire un script en sh qui permet de créer un fichier contenant au maximum 4 articles. Il faut veiller à ne pas couper un carton. c'est pour cela que le 1er fichier ne contient que deux articles. Le 2ème fichier contient 4 articles appartenant à 2 cartons différents. (454 et 65), etc.
    J'ai essayé de créer deux tableaux dans lequel j'ai le numéros Articles et les numéro cartons puis pousser quelques lignes sous les conditions que j'ai expliquées ci-dessus:
    Pouvez-vous m'aider svp?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Bonjour,

    script sh
    il faut au moins bash pour avoir accès aux tableaux.
    ça doit être 100% «sh» (bash), ou tu peux utiliser d'autres langages ? awk serait mieux indiqué...
    La dernière colonne contient le numéro de fichier dans lequel on écrit ces articles.
    alors le travail est déjà fait, non ?

    J'ai essayé de créer deux tableaux dans lequel j'ai le numéros Articles et les numéro cartons
    il faudrait plutôt un tableau qui contient, pour chaque carton, le nombre d'article :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    carton[<n°Carton>]=<nbArticle>
    ...
    ?

    EDIT : le fichier en entrée est en HTML ? sinon, quel son véritable format ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    le script peut-être en awk.
    J'avais pensé au SH.
    Voici le code que j'avais commencé à écrire:

    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
     
    #!/bin/sh
    #set-x
    echo Declaration d\'un tableau a 1 colonne NumART
    declare -a  NumArt
    NumArt=(ZZZZ CCDE AZDSDS SDSEE AAAZE TTGYH DFDF ARFFF TRUCC TOUKC) 
    #echo ${NumArt[1]}
    echo Declaration d\'un tableau a 1 dimension NumCarton
    declare -a NumCarton
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    #echo ${NumCarton[*]}
     
    variable=$NumCarton[0]
    touch fichier.txt
    Nbre_lig_fic= cat fichier.txt | wc -l
    while [[ $Nbre_lig_fic -le 1 ]]
    do 
    	if ["$variable" -eq $NumCarton[1]]
    	then  "$NumArt[0]" "$NumCarton[0]" >> fichier.txt
    	fi
    done
    #cat fichier.txt
    J'avais commencé par créer deux tableaux.
    J'ai fais une boucle pour pouvoir pousser chaque ligne selon les conditions énoncées dans mon poste précédent dans un fichier.

    Voilà ou j'en suis maintenant.

    La dernière colonne contient les numéros de fichiers. Au final je dois avoir 3 fichiers.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par bricko Voir le message
    j'ai en entrée un fichier qui ressemble à celui-ci
    N_Bah t'a demandé son format exact. Un fichier texte ? Le séparateur des éléments ? Est-il toujours trié (comme c'est montré) par n° de carton ?

    Citation Envoyé par bricko Voir le message
    La dernière colonne contient le numéro de fichier dans lequel on écrit ces articles.
    N_Bah t'a indiqué que cela résolvait tout non ? Si tu as déjà l'info de savoir dans quel fichier écrire tu n'as plus à faire d'algo. Te suffit juste de prendre le fichier indiqué et d'écrire quoi !!!

    Quoi qu'il en soit sh est tout à fait capable de faire ce genre de truc mais moi je passerais quand-même par un langage plus puissant comme Python. Il offre quand-même bien plus d'outils qui, selon les réponses aux questions ci-dessus, pourraient être utiles (notemment une possibilité de tri de tableau selon une clef que tu définis)...

    Citation Envoyé par bricko Voir le message
    Voici le code que j'avais commencé à écrire:
    Ton code ne prend absolument pas de fichier en input, tu lui as mis les valeurs en dur !!!???!!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    J'ai choisi de commencer par un tableau.

    La dernière colonne indique effectivement le fichier. Mais elle n'est pas dans mon input. En input, j'ai un fichier en deux colonnes.
    Pour faciliter les choses, je l'ai transformé en tableau à 1 dimension pour pouvoir le manipuler.
    Le script sh est imposé.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    bien sûr, tu as testé ton script, et il fonctionne à peu près
    parce que tel quel, il est plein d'erreurs.

    normalement, /bin/sh ne supporte pas les tableaux.
    ça peut être un alias vers bash, mais alors le shebang doit être /bin/bash.
    on indique /bin/sh pour dire que le code est strictement POSIX, c'est à dire sans test étendu, tableaux ...

    je te recommande de lire les tutoriels inscrits dans ma signature.

    Citation Envoyé par bricko
    En input, j'ai un fichier en deux colonnes.
    Citation Envoyé par Sve@r
    N_Bah t'a demandé son format exact.
    .

    Le script sh est imposé.
    voir plus haut
    shc'est à dire ? du code strictement POSIX ? ou bash, et que bash, et donc pas de solutions en awk ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Le sh arrive normalement à gérer les tableaux à une dimension.
    Oui le code contient plusieurs erreurs et je suis entrain de les corriger.
    Je tente d'inscrire une ligne dans un fichier mais je n'y arrive.
    En input, j'ai deux tableaux à 1 dimension.

    voici le code que j'ai jusqu'à maintenant:
    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
     
    #!/bin/sh
    #set-x
    echo Declaration d\'un tableau a 1 colonne NumART
    declare -a  NumArt
    NumArt=(ZZZZ CCDE AZDSDS SDSEE AAAZE TTGYH DFDF ARFFF TRUCC TOUKC) 
    echo ${NumArt[*]}
    echo Declaration d\'un tableau a 1 dimension NumCarton
    declare -a NumCarton
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    echo ${NumCarton[*]}
     
    variable=${NumCarton[0]}
    varbis=${NumCarton[1]}
    echo $varbis
    echo $variable
    touch fichier.txt
    Nbre_lig_fic= cat fichier.txt | wc -l
    echo $Nbre_lig_fic
    while [[ $Nbre_lig_fic -le 1 ]]
    do 
    	if [ "$variable" -eq "$varbis" ];
     
    	then  "$variable" >> fichier.txt
     
    	else echo "not good!"
    	fi
    done
    #cat fichier.txt

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Le sh arrive normalement à gérer les tableaux à une dimension.
    parce que c'est un alias vers /bin/bash, ou parce que tu appelles ton script avec bash (bash tonScript ).
    sh est le Bourne SHell, sur lequel est fondée la norme POSIX, qui ne définit pas les tableaux.
    des shells plus évolués, tels que Korn SHell, ou Bourne Again SHell, possédent des tableaux unidimensionnels, indexés ou associatifs.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Vous avez surement raison.

    J'ai juste envie maintenant de pousser une ligne dans un fichier que j'ai ouvert avec la commande touch:

    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
     
    #!/bin/sh
    #set-x
    echo Declaration d\'un tableau a 1 colonne NumART
    declare -a  NumArt
    NumArt=(ZZZZ CCDE AZDSDS SDSEE AAAZE TTGYH DFDF ARFFF TRUCC TOUKC) 
    echo ${NumArt[*]}
    echo Declaration d\'un tableau a 1 dimension NumCarton
    declare -a NumCarton
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    echo ${NumCarton[*]}
     
    variable=${NumCarton[0]}
    varbis=${NumCarton[1]}
    echo $varbis
    echo $variable
    touch fichier.txt
    Nbre_lig_fic= cat fichier.txt | wc -l
    echo $Nbre_lig_fic
    while [[ $Nbre_lig_fic -le 1 ]]
    do 
    	if [ "$variable" -eq "$varbis" ];
    	then " ${NumArt[0]}","${NumCarton[1]}" > fichier.txt
            fi
    done
    #cat fichier.txt
    Pouvez-vous m'aider le problème avec ma condition if.

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Vous avez surement raison.
    alors, adapte ton shebang !

    touch n'ouvre pas un fichier en écriture. il le crée s'il n'existe pas, et actualise ses dates s'il existe (cf. man touch).

    il faut vraiment que tu lises les tutoriels qui figurent dans ma signature.
    edit: et les messages d'erreurs que t'envoie l'interpréteur.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    Je suis à ce niveau maintenant:

    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
     
    #!/bin/sh
    #set-x
    echo Declaration d\'un tableau a 1 colonne NumART
    declare -a  NumArt
    NumArt=(ZZZZ CCDE AZDSDS SDSEE AAAZE TTGYH DFDF ARFFF TRUCC TOUKC) 
    echo ${NumArt[*]}
    echo Declaration d\'un tableau a 1 dimension NumCarton
    declare -a NumCarton
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    echo ${NumCarton[*]}
     
    variable=${NumCarton[0]}
    varbis=${NumCarton[1]}
    echo $varbis
    echo $variable
    file="./fichier.txt"
    touch $file
    Nbre_lig_fic= cat $file | wc -l
    #echo $Nbre_lig_fic
    while [[ $Nbre_lig_fic -le 4 ]]
    do 
    	if [ "$variable" -eq "$varbis" ];
    	then echo " ${NumArt[0]}","${NumCarton[1]}" > $file
            fi
    done
    #cat fichier.txt
    J'arrive à créer mon premier fichier avec une seule ligne(ZZZZ,88). Sauf que je ne vois pas comment je vais boucler sur le reste de mes tableaux pour n'insérer au final que 4 lignes/fichiers

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bricko Voir le message
    Sauf que je ne vois pas comment je vais boucler sur le reste de mes tableaux...
    Ben si tu ne sais pas faire une boucle, il faudrait alors que tu commences par apprendre les bases de la programmation quoi !!!

    Code bash : 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
    #!/bin/bash
    tab=("toto" "titi" "tata")
     
    for x in ${tab[@]}
    do
    	echo $x
    done
     
    i=0
    while test $i -lt ${#tab[*]}
    do
    	echo "Elément $i: ${tab[$i]}"
    	i=$(($i + 1))
    done
     
    for i in $(seq 0 $((${#tab[*]} - 1)))
    do
    	echo "Elément $i: ${tab[$i]}"
    done

    Citation Envoyé par bricko Voir le message
    pour n'insérer au final que 4 lignes/fichiers
    Regarde le résultat de i % 4...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Merci à tous pour votre aide. Mais je galère encore à reproduire ce que je veux en sh.
    Je vais essayer de m'exprimer en pseudo-code:
    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
     
    Je commence par créer 2 tableaux contenant mes NumArt et NumCarton
    je crée une première variable = ${NumCarton[0]} qui compte le nombre de cartons qui ressemble à NumCarton[0] => première valeur
    je crée une deuxième variable =${NumCarton[Nombre que je viens de trouver]} => J'ai une deuxième Valeur
    si première valeur + deuxième valeur <=4
       boolean 2Cartons = true
       Ouverture du 1er fichier
      copie les lignes dont les numéro de cartons ressemble à NumCarton[première valeur] et NumCarton[deuxième valeur]
      fermer le 1er fichier
     
    sinon
       boolean 2Cartons = false
       Ouverture du 2ème fichier
       copie les lignes dont le NumCartons[première valeur]
       fermer le 2ème fichier
    fin
     
    si 2Cartons == False
       prendre première valeur = première valeur+1
    sinon
       prendre première valeur = première valeur +2
    Puis boucler pour créer le 2ème fichier, 3ème fichier.

    Je n'arrive pas à bien le faire en SH.
    A l'aide svp!!

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,
    A ce que j'ai compris de ton algo, tu passes par la force brute, heureusement que tes cartons ne dépassent pas 4 articles.
    Est-ce que tu as testé cet algo sur ton tableau pour voir si tu obtenais la même chose ?
    Question subsidiaire: Est-ce que ton algo garantie l'utilisation minimum de fichier ?
    Cordialement.

  15. #15
    Membre du Club
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2013
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lille
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    Je n'arrive pas malheureusement à tester mon algo en SH.
    Je suis très nouveau dans ce langage.
    L'algo mis en place ne garantie pas l'utilisation minimum de fichiers.
    La seule condition que j'aie c'est de ne pas couper un carton en deux ou trois. Tous les articles appartenant à un carton doivent se retrouver dans le même fichier.

    Un fichier peut avoir un ou deux cartons. Mais la somme des articles d'un fichier ne peut dépasser 4.

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    J'ai enfin compris

    La 3° colonne de ton tableau ce n'est pas une info qui se trouve dans le fichier input mais c'est le n° de fichier dans lequel tu voudrais écrire et que tu dois alors calculer par rapport à tes contraintes (ne pas couper de carton et ne pas dépasser 4)

    Si c'est ça, j'ai la solution
    Code bash : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/bin/bash
    # fonction qui extrait une partie de l'info
    split()
    {
    	echo "$1" |cut -f$2
    }
     
    # Effacement des ancients fichiers
    rm -f ?
     
    # Jeu de test
    data=("ZZZ 	88" "CCDE 	88" "AZDSDS 	454" "SDSEE 	454" "AAZE 	454" "TTGYH 	65" "DFDF 	874" "ARFFF 	874" "TRUCC 	21" "TOUCK 	21" "_EOF_	_EOF_")
     
    # Traitement des datas
    fich=1
    nb_lig=0
    for info in "${data[@]}"
    do
    	# Si le n° de carton a changé
    	carton=$(split "$info" 2)
    	if test "$carton" != "$mem_carton"
    	then
    		# On a un nouveau carton
    		mem_carton="$carton"
     
    		# S'il y a des précédentes données à écrire on les écrit dans le fichier
    		if test "${#buffer[*]}" -gt 0
    		then
    			for lig in "${buffer[@]}"
    			do
    				echo "$lig"
    			done >>"$fich"
    		fi
     
    		# On mémorise le nb de lignes écrites
    		nb_lig=$(expr $nb_lig + ${#buffer[*]})
     
    		# Le buffer est réinitialisé pour le nouveau carton
    		buffer=()
    	fi
     
    	# Ajout des données dans le buffer des datas à écrire
    	buffer[${#buffer[*]}]="$(split "$info" 1) $carton"
     
    	# Si les données dépassent la taille de 4
    	if test $(expr ${#buffer[*]} + $nb_lig) -gt 4
    	then
    		# On a un nouveau fichier
    		fich=$(expr $fich + 1)
    		nb_lig=0
    	fi
    done

    Principe: tant que le n° de carton est le même, les datas sont stockées dans un buffer temporaire. Dès que le n° de carton change, le buffer temporaire (contenant les datas du carton précédent) est vidé dans un fichier et réinitialisé pour le nouveau carton (ce qui m'oblige à avoir des marqueurs de fin "_EOT_" pour pouvoir écrire le dernier buffer). Et si le nb de lignes du buffer plus le nb de lignes déjà écrites dépasse 4, je passe à un nouveau fichier
    Bug connu: si jamais il y a plus de 4 infos ayant le même n° de carton, l'ensemble des infos sera stocké dans un fichier qui aura alors plus de 4 lignes. Mais comme t'as dit que cela ne pouvait pas arriver...

    Les extraction des n° d'article et de cartons sont déportées dans une fonction dédiée à laquelle je passe la position de la data à extraire. Comme ça, si jamais le format des données d'entrée change (le séparateur par exemple), il n'y a qu'une modif à faire dans le code. C'est aussi pour ça d'ailleurs que je n'écris pas directement $info dans le buffer (je ne suis pas sûr que le format d'entrée corresponde au format que moi je veux) mais que j'écris les infos extraites...

    Voilà le résultat
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ ./essai.sh 
    $ cat 1
    ZZZ  88
    CCDE  88
    $ cat 2
    AZDSDS  454
    SDSEE  454
    AAZE  454
    TTGYH  65
    $ cat 3
    DFDF  874
    ARFFF  874
    TRUCC  21
    TOUCK  21
    $
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat cartons.txt 
    NumArt NumCarton 	
    ZZZ 88 	
    CCDE 88 	
    AZDSDS 454 	
    SDSEE 454 	
    AAZE 454 	
    TTGYH 65 	
    DFDF 874 	
    ARFFF 874 	
    TRUCC 21 	
    TOUCK 21
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk '{a[$2]++;} (a[$2]==1){num++;} {print >"file_cartons"num".txt"}' cartons.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ grep [A-Z] file_cartons*
    file_cartons1.txt:NumArt NumCarton 	
    file_cartons2.txt:ZZZ 88 	
    file_cartons2.txt:CCDE 88 	
    file_cartons3.txt:AZDSDS 454 	
    file_cartons3.txt:SDSEE 454 	
    file_cartons3.txt:AAZE 454 	
    file_cartons4.txt:TTGYH 65 	
    file_cartons5.txt:DFDF 874 	
    file_cartons5.txt:ARFFF 874 	
    file_cartons6.txt:TRUCC 21 	
    file_cartons6.txt:TOUCK 21
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ grep [A-Z] file_cartons*
    file_cartons1.txt:NumArt NumCarton 	
    file_cartons2.txt:ZZZ 88 	
    file_cartons2.txt:CCDE 88 	
    file_cartons3.txt:AZDSDS 454 	
    file_cartons3.txt:SDSEE 454 	
    file_cartons3.txt:AAZE 454 	
    file_cartons4.txt:TTGYH 65 	
    file_cartons5.txt:DFDF 874 	
    file_cartons5.txt:ARFFF 874 	
    file_cartons6.txt:TRUCC 21 	
    file_cartons6.txt:TOUCK 21
    T'as mal lu son problème
    L'info "TTGHY 65" doit se trouver dans le fichier 3 vu que cela ne dépasse pas 4 lignes. De même pour les 4 infos restantes (874 et 21) qui doivent se trouver dans le fichier n° 4 !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    expr n'est pas une commande utile dans des scripts compatibles POSIX.

    ligne 43 : pourquoi buffer[${#buffer[*]}]="$(split "$info" 1) $carton", et pas buffer[${#buffer[*]}]="$info" ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    T'as mal lu son problème
    L'info "TTGHY 65" doit se trouver dans le fichier 3 vu que cela ne dépasse pas 4 lignes. De même pour les 4 infos restantes (874 et 21) qui doivent se trouver dans le fichier n° 4 !!!
    Citation Envoyé par disedorgue Voir le message
    Bonjour,
    (...)
    Est-ce que ton algo garantie l'utilisation minimum de fichier ?
    Citation Envoyé par bricko Voir le message
    Bonjour,
    (...)
    L'algo mis en place ne garantie pas l'utilisation minimum de fichiers.
    La seule condition que j'aie c'est de ne pas couper un carton en deux ou trois. Tous les articles appartenant à un carton doivent se retrouver dans le même fichier.

    Un fichier peut avoir un ou deux cartons. Mais la somme des articles d'un fichier ne peut dépasser 4.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. [Oracle] prob algo : Répartition données
    Par olwin dans le forum SGBD
    Réponses: 4
    Dernier message: 23/04/2010, 16h54
  2. [RECHERCHE] Algo de répartition
    Par cybermaxs dans le forum Mathématiques
    Réponses: 5
    Dernier message: 17/11/2009, 09h04
  3. cherche algos Delphi pour : Huffman, R.S.A, D.E.S.
    Par X-Delphi dans le forum Débuter
    Réponses: 3
    Dernier message: 24/08/2002, 18h51
  4. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  5. Recherche algo tree
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/05/2002, 13h44

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