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. #21
    Membre confirmé
    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
    Par défaut
    Merci beaucoup @ Sve@r
    Mais il faut vraiment que je me mette à ce langage.
    Un conseil a donner pour un débutant?

  2. #22
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    Oui: RTFM (read the fucking manual) Lis la putain de documentation

  3. #23
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ligne 43 : pourquoi buffer[${#buffer[*]}]="$(split "$info" 1) $carton", et pas buffer[${#buffer[*]}]="$info" ?
    Citation Envoyé par Sve@r Voir le message
    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...
    Comme il n'a jamais donné le fichier d'entrée, utilisant toujours des exemples de test pour ses algo, j'ai alors essayé de faire un script souple permettant de traiter ensuite n'importe quel format d'entrée. Ainsi si le format d'entrée change (que le séparateur n'est pas une tabulation mais un point-virgule par exemple), je garantis quand-même mon format de sortie...

    Citation Envoyé par Flodelarab Voir le message
    Citation Envoyé par bricko Voir le message
    Un fichier peut avoir un ou deux cartons. Mais la somme des articles d'un fichier ne peut dépasser 4.
    Oui un fichier peut n'avoir qu'un ou deux cartons parce que le groupe suivant est au nombre de 4 ce qui ferait alors dépasser. Regarde son tout premier exemple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ZZZ 	88 	1
    CCDE 	88 	1
    AZDSDS 	454 	2
    SDSEE 	454 	2
    AAZE 	454 	2
    TTGYH 	65 	2
    Le fichier n° 1 ne contient que 2 articles parce qu'il y a 3 cartons "454" et qu'on ne peut pas mettre en plus ces 3 dans le fichier n° 1. Toutefois le carton n° 65 qui est unique peut quand-même rentrer dans le fichier n° 2...

    Citation Envoyé par bricko Voir le message
    Mais il faut vraiment que je me mette à ce langage.
    Un conseil a donner pour un débutant?
    Prendre un tuto et le lire puis se mettre à résoudre ses problèmes. Tu en as un justement sur le site developpez.net...

    Citation Envoyé par Flodelarab Voir le message
    Oui: RTFM (read the fucking manual) Lis la putain de documentation
    On le dit plutôt pour quelqu'un qui pose des questions bateau, comme par exemple comment fonctionne cut ou ls, pas pour un débutant qui demande comment apprendre le langage...
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Oui: RTFM (read the fucking manual) Lis la putain de documentation
    le manuel est très aride, un lien vers de la documentation plus étoffée serait sûrement apprécié; l'ABS, au moins, par exemple.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #25
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    @ Sve@r: Tu te compliques la vie: il ne cherche pas d'optimisation.

    S'il en cherchait une, je ferais la liste des numCarton à 1, 2, 3 et 4 éléments et les arrangements optimaux seraient:
    4
    3 1
    2 2
    2 1 1
    1 1 1 1

    Le résidu imparfait serait:
    3
    2 1
    2
    1 1
    1

    Tout ça avec awk bien sur (toujours a[$2]++ et for (i in a) )
    Reste à déterminer dans chaque cas le facteur limitant.

  6. #26
    Membre confirmé
    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
    Par défaut
    J'avais commencé à travailler de mon côté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    declare -a NumCarton
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    declare -A res
    for carton in "${NumCarton[@]}"
    do
    echo "carton: $carton"
    res[$carton]=$((${res[$carton]}+1))
    done
    echo ${res[@]}
    J'ai un resultat dans mon tableau res qui devrait être de 2 3 1 2 2

    Au lieu de cela j'ai l'impression que le mon tableau res est trié en quelque sorte.
    Ai-je fais une erreur je n'en vois pas .

  7. #27
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    : il ne cherche pas d'optimisation.
    J'ai pas dit qu'il en cherchait, j'ai juste dit que mon code reproduisait les résultats montrés dans son exemple (et, sous-entendu, en espérant que les données restent toujours triées par n° de carton). D'ailleurs moi non plus je n'optimise pas, je me contente juste de remplir les fichiers tant que ça rentre. Prends par exemple le cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ZZZ 	88
    CCDE 	88
    AZDSDS 	454
    SDSEE 	454
    AAZE 	454
    PAPA 	454
    TTGYH 	65
    Mon algo placera le carton 65 dans le fichier n° 3 alors qu'un algo optimisé le placerait dans le n° 1...

    Citation Envoyé par Flodelarab Voir le message
    S'il en cherchait une, je ferais ...
    Tout ça avec awk bien sur
    Perso je prendrais plutôt Python mais bon, chacun sa façon de se compliquer la vie...

    Citation Envoyé par bricko Voir le message
    J'avais commencé à travailler de mon côté......Au lieu de cela j'ai l'impression que le mon tableau res est trié en quelque sorte.
    Ai-je fais une erreur je n'en vois pas .
    Ben oui. Tu incrémentes res[carton]. Donc au premier carton (88) t'as res[88] qui est créé. Quand tu en es au carton 21, t'as res[21] qui est alors créé. Et au final, quand tu affiches la totalité du tableau res, ça affiche alors res[21] avant res[88]...
    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]

  8. #28
    Membre confirmé
    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
    Par défaut
    Mais comment alors faire pour afficher exactement ce que je veux c'est-à-dire: 2 3 1 2 2

  9. #29
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Ben faut que tu te débrouilles pour faire une association 88=0; 454=1; 65=2 etc. pour pouvoir stocker "2" (représentant le nb de colis n° 88) dans l'élément [0]; "3" (représentant le nb de colis n° 454) dans l'élément 1 etc.

    Accessoirement ce genre de mécanisme est possible en shell mais au prix de grandes manipulations car il n'est absolument pas fait pour ça. T'as en effet dans Unix/Linux d'autres outils de programmation bien plus adaptés à ce genre de problème.

    Exemple en Python
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    NumCarton=(88, 88, 454, 454, 454, 65, 874, 874, 21, 21)
    res={}
    for carton in NumCarton: res[carton]=(res[carton] + 1) if carton in res.iterkeys() else 1
    print "; ".join("carton %d: %d" % (k, v) for (k, v) in res.iteritems())

    Et le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ python essai.py 
    carton 88: 2; carton 65: 1; carton 874: 2; carton 21: 2; carton 454: 3
    Et si tu veux le résultat dans l'ordre d'arrivée des cartons, l'association dont je parle n'est alors pas très compliquée à faire...
    Code python : 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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # Retourne l'index correspondant à un n° de carton
    def index(tab, carton):
    	try:
    		return [x[0] for x in tab].index(carton)
    	except (IndexError, ValueError):
    		return None
    	# try
    # index()
     
    NumCarton=(88, 88, 454, 454, 454, 65, 874, 874, 21, 21)
    res=[]
    for carton in NumCarton:
    	idx=index(res, carton)
    	if idx is None:
    		res.append([carton, 1])			# Ici  je fais l'association => j'ajoute le dernier carton arrivé dans mon tableau qui restera alors dans ce même ordre
    	else:
    		res[idx][1]+=1
    	# if
    # for
    print "; ".join("carton %d: %d" % (x[0], x[1]) for x in res)

    Et le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ python essai2.py 
    carton 88: 2; carton 454: 3; carton 65: 1; carton 874: 2; carton 21: 2
    Maintenant si tu veux quand-même le faire en shell, c'est possible. Tu peux par exemple stocker dans ton tableau non pas 2 3 en positions [88] et [454] mais "88;2" "454;3" en positions [0] et [1]. Puis dès que t'as un carton 454, tu cherches dans le tableau sa position [1], tu incrémentes sa quantité et tu le restockes (ce que j'ai fait dans mon second exemple Python en fait). Pas facile mais ce sera un bel exercice de style.

    [edit]Bon ben je l'ai fait aussi en shell
    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
    #!/bin/bash
    index()
    {
    	(
    		carton=$1; shift
    		i=0
    		for x in $*
    		do
    			test "$(echo "$x" |cut -f1 -d:)" = "$carton" && echo $i
    			i=$(($i+1))
    		done
    	)
    }
     
    NumCarton=(88 88 454 454 454 65 874 874 21 21)
    declare -a res
    for carton in "${NumCarton[@]}"
    do
    	idx=$(index $carton "${res[@]}")
    	test -n "$idx"\
    		&& res[$idx]="$carton:$(($(echo ${res[$idx]} |cut -f2 -d:)+1))"\
    		|| res[${#res[*]}]="$carton:1"
    done
    echo "${res[@]}"

    Et le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./essai2.sh 
    88:2 454:3 65:1 874:2 21:2
    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]

  10. #30
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    [mode_Teigneux]
    Malgré le pouce baissé du message #17, j'en remets une couche, toujours en une ligne:
    [/mode_Teigneux]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk '(NR>1){a[$2]++;} END{for (i in a) printf i":"a[i]" ";print "";}' cartons.txt
    874:2 21:2 65:1 454:3 88:2
    $

  11. #31
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    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
    $ 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
    $ awk '(NR>1){a[$2]++;} END{for (i in a) printf i":"a[i]" ";print "";}' cartons.txt
    454:3 65:1 21:2 88:2 874:2 
    $
    Le résultat (qui n'est d'ailleurs pas le même que le tien ce qui est étonnant sauf si t'as changé ton jeu d'essais sans nous le dire) n'est pas dans l'ordre des cartons du fichier d'origine. T'as pas vu que c'est ce qu'il demande depuis le message #26 ???
    Citation Envoyé par bricko Voir le message
    Mais comment alors faire pour afficher exactement ce que je veux c'est-à-dire: 2 3 1 2 2
    Citation Envoyé par Flodelarab Voir le message
    toujours en une ligne:
    Ben entre un programme en une ligne qui ne répond pas à la demande, et un programme en 500 qui y répond, moi je fais mon choix et ce n'est certainement pas le code en une ligne.
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Citation Envoyé par Flodelarab
    il ne cherche pas d'optimisation
    ce serait quand même un gage de robustesse de l'algorithme, non ?
    cette optimisation du nombre de fichiers utilisés est la première chose à laquelle j'ai pensé en lisant l'énoncé.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Citation Envoyé par bricko
    comment alors faire pour afficher exactement ce que je veux c'est-à-dire: 2 3 1 2 2
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ declare -ai nbArt
    $ 
    $ while read -r item carton
    > do
    >    ((${#Cartons[$carton]})) && Cartons[$carton]+="|$item" || Cartons[$carton]="$item"
    >    nbArt[$carton]+=1
    > done < $fichier
    $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ for i in ${!Cartons[@]}
    > do
    >    echo "le carton n° $i contient ${nbArt[$i]} articles : ( ${Cartons[i]//|/ } )"
    > done
    le carton n° 21 contient 2 articles : ( TRUCC TOUCK )
    le carton n° 65 contient 1 articles : ( TTGYH )
    le carton n° 88 contient 2 articles : ( CCDE ZZ )
    le carton n° 454 contient 3 articles : ( AZDSDS SDSEE AAZE )
    le carton n° 874 contient 2 articles : ( DFDF ARFFF )
    les tableaux indexés n'ont pas besoin d'être déclarés explicitement.
    nbArt est déclaré explicitement pour lui attribuer le type numérique.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #34
    Membre confirmé
    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
    Par défaut la fonction split()
    Merci beaucoup pour votre aide.
    Mais j'aurais encore besoin de vous.
    J'ai pas très bien compris la fonction de @Sve@r
    La fonction split() que fait-elle exactement?

  15. #35
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bricko Voir le message
    La fonction split() que fait-elle exactement?
    Dans mon premier code, j'ai regroupé dans le tableau d'entrée l'article et le carton en les séparant par une tabulation, comme cela: data=("ZZZ 88" "CCDE 88" "AZDSDS 454" "SDSEE 454" "AAZE 454" "TTGYH 65" "DFDF 874" "ARFFF 874" "TRUCC 21" "TOUCK 21" "_EOF_ _EOF_"). En effet, en programmation structurée on aime bien regrouper ensemble les données qui vont ensembles. Ca aide à la lecture et à la maintenance. Par exemple si je dois rajouter ou enlever un article et un carton, je n'ai qu'une modif à faire.

    Toutefois, à certains moments du code, j'ai besoin de récupérer le n° d'article ou bien le n° de carton. Ben c'est ce que fait la fonction split(). Je lui passe une information groupée (exemple "ZZZ 88" et la position de l'élément que je veux récupérer (1 pour l'article ou 2 pour le carton) et elle, elle coupe l'information pour extraire ce que je veux (ZZZ ou 88).

    Ensuite, pour renvoyer la valeur récupérée, je me contente de l'afficher. En effet, en shell, le return dans une fonction n'a pas le même sens que dans les autres langages dans la mesure où la valeur retournée (qui soit être impérativement un nombre entre 0 et 255) n'est là que pour indiquer un état ok/pas ok (0=ok, autre chose=pas ok).
    Donc si je veux écrire une fonction qui renvoie une valeur ("renvoie" dans le sens qu'on utilise habituellement dans les autres langages c'est à dire une chaine, un calcul mathématique, etc), je dois lui faire faire un affichage de l'élément que je veux renvoyer. Et l'appelant, lui, pour récupérer l'élément renvoyé par la fonction, doit utiliser le mécanisme de récupération d'éléments externes, c'est à dire les backquottes ou le $(...).

    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    # Fonction qui concatène deux chaines
    fct()
    {
        echo "$1$2"
    }
     
    chaine=$(fct "Hello" "World")
    echo "chaine=[$chaine]
     
    chaine=`fct "World" "Hello"`
    echo "chaine=[$chaine]

    J'aurais pu très bien ne pas mettre de fonction et couper l'info à chaque fois que j'en avais besoin. Suffisait de reprendre le echo |cut... à chaque fois que j'appelais split.
    Toutefois j'ai aussi envisagé que le format d'entrée puisse changer (tu ne nous l'as jamais donné). Et que par exemple le séparateur article/carton ne soit plus la tabulation mais par exemple un espace, ou bien les deux-points("ZZZ:88"). Dans ce cas, il aurait fallu modifier tous les endroits où je découpais l'information.
    Pour éviter ce soucis, j'ai préféré passer par une fonction dédiée. Comme ça, si le séparateur change, il suffit alors de modifier la fonction et ça suffit (factorisation de code).

    Exemple avec le séparateur ":"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    # fonction qui extrait une partie de l'info
    split()
    {
    	echo "$1" |cut -f$2 -d:
    }
     
    # 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_")
    ... (reste du code sans changement)...
    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]

  16. #36
    Membre confirmé
    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
    Par défaut
    Bonjour,
    Merci pour toutes ces explications.
    Le format d'entrée de mon input est un fichier. j'avais commencé avec des tableaux vu que je ne savais comment manipuler les fichiers.
    Reste à voir comment je vais transformer mon fichier d'entrée en tableau.

  17. #37
    Membre confirmé
    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
    Par défaut le buffer
    Bonjour,
    le script fait appelle à une fonction .
    Je ne suis pas sur de bien comprendre.
    Est-ce une fonction ou un tableau.
    Aussi dans le code je vois une variable qui est évoquée alors qu'elle n'est pas déclarée avant.
    Quelle étrange langage qu'est shell
    Pouvez-vous m'éclairer ma lanterne

  18. #38
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bricko Voir le message
    Le format d'entrée de mon input est un fichier.
    Oui ça on l'avait compris. C'est la façon dont il est écrit qui nous intéresse (comment sont séparés les infos, est-ce une info par ligne (n° d'article puis n° de carton) ou bien (un peu plus conforme) les deux ensembles sur une ligne. Et si c'est le cas, comment sépares-tu le n° d'article du carton (un espace, une tabulation, un point-virgule, ...)
    Citation Envoyé par bricko Voir le message
    j'avais commencé avec des tableaux vu que je ne savais comment manipuler les fichiers.
    C'est expliqué dnas les tutos. Faudrait quand-même commencer à les lire un peu...

    Citation Envoyé par bricko Voir le message
    Reste à voir comment je vais transformer mon fichier d'entrée en tableau.
    T'es pas obligé. Si le format du flux entrant est le même que le tableau (<article><tabulation><carton>), on peut adapter très facilement le script au fichier. Suffit de changer le premier for...

    Citation Envoyé par bricko Voir le message
    le script fait appelle à une fonction buffer.
    Je ne suis pas sur de bien comprendre.
    Est-ce une fonction ou un tableau.
    Si c'était une fonction, alors son appel serait en début de ligne (ou en début de parenthèses dans le cas de var=$(...)). Tu vois bien que son identificateur commence par un "$" (if test "${#buffer[*]}" -gt 0) donc c'est une variable. Et comme il y a des crochets, c'est un tableau.

    Citation Envoyé par bricko Voir le message
    Aussi dans le code je vois une variable mem_carton qui est évoquée alors qu'elle n'est pas déclarée avant.
    Ce n'est pas obligé en shell. T'as qu'à essayer dans ta fenêtre terminal de taper echo :$toto: et bien que la variable $toto n'existe pas, tu auras à l'écran :: sans problème ni message d'erreur.
    Toutefois dans mon test, je suis obligé de l'encadrer de guillemets doubles. Parce que si j'écrivais if test $carton != $mem_carton et que la variable n'existe pas, au premier appel le shell verrait if test 88 != ce qui lui semblerait incompréhensible (une inégalité implique obligatoirement deux opérandes).
    Ainsi avec les guillemets, au premier carton le shell voit if test "88" != "" et non seulement l'instruction ne pose pas de soucis mais en plus l'inégalité étant vérifiée, le premier carton trouvé le fait entrer dans le bloc "nouveau carton" ce qui est parfait.
    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. #39
    Membre confirmé
    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
    Par défaut fichier en entrée
    Mon fichier d'entrée est plutôt .
    La séparation est faite par une tabulation.
    Dans ce cas comment opérer les changements dans ma boucle .

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    Je ne suis pas très fier de cette solution, mais ça fait le job:

    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
    1
    2
    3
    4
    $ rm -f file_cartons*.txt;awk '(NR==1){next;} (a[$2]==0){printf "\n"} {a[$2]++; printf " "$0;}' cartons.txt|awk 'NR==1{next;} {if (e+NF<9) {e=e+NF;carton=carton$0;} else {num++;print carton>"file_cartons"num".txt";carton=$0;e=NF} } END{num++;print carton>"file_cartons"num".txt";}';grep [A-Z] file_cartons*
    file_cartons1.txt: ZZZ 88 CCDE 88
    file_cartons2.txt: AZDSDS 454 SDSEE 454 AAZE 454  TTGYH 65
    file_cartons3.txt: DFDF 874 ARFFF 874  TRUCC 21 TOUCK 21

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