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 :

bash substring optimisation


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2003
    Messages : 22
    Par défaut bash substring optimisation
    Bonjour,
    Je reçois par mail des pièces jointes au format texte.
    Elles consistent en une chaine de caractères et sont de longueur variable de
    700/800 caractères pour les petites et jusqu'à 500 000/600 000 caractères
    ou plus.
    Reviennent de façon aléatoire des marqueurs/séparateurs de sous-chaines
    sur 4 caractères au sein de la chaine.
    Pour l'instant j'ai une boucle for qui parcourt la chaine et récupère la position
    du marqueur courant. Je procède ensuite à une extraction du début de la chaine
    jusqu'au marqueur et vais chercher le marqueur suivant, ceci jusqu'à traitement
    de l'ensemble des caractères de la chaine.
    Cette méthode nécessite 19secondes pour traiter env. 2600 caractères.Bref,
    c'est lent !
    Quelqu'un aurait-il une idée pour réaliser cette opération ?
    Synthétiquement on pourrait représenter la chaine ainsi
    xxxxxxxxxxxxMMMMxxxxxxxxxxxxxxxxxxxxxxxxxxxxMMMMxxxxxxxxxx
    avec x les caractères quelconques et MMMM le marqueur.
    J'ai fait quelques essais avec sed mais en fait je ne veux pas
    chercher/remplacer mais récuperer la position de chaque 1er caractère
    du marqueur.

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Peut être qu'en connaissant la finalité du traitement effectué sur chaque chaîne, nous serait-il possible de t'aider au mieux en te proposant l'outil (ou les outils) le(s) plus approprié(s) à ta demande.

    A priori, je ne pense pas que déterminer la position d'un motif afin d'en extraire la chaine précédente, ou suivante, pour un éventuel traitement et remettre ça dans la foulée avec la chaîne suivante et ainsi de suite jusqu'à la fin de la ligne, soit le plus adéquat...

    Mais bon, peut être que je me trompe


  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2003
    Messages : 22
    Par défaut
    En fait la chaine reçue représente des fichiers texte mis bout à bout.
    La fin d'un fichier "logique" est marquée par le séparateur.
    Le traitement consiste à repérer le séparateur pour extraire de la
    chaine (entre pos 0 et pos séparateur) une sous chaine enregistrée
    sur le disque. Le fichier logique devient ainsi un fichier physique
    disponible pour traitement ultérieur.
    Ceci explique également pourquoi le marqueur n'est pas à position
    fixe et pourquoi la chaine a une longueur variable.
    J'espère que c'est plus clair ...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    En espérant avoir tout compris et en reprenant ton exemple, un traitement à base de "sed" me semble tout approprié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat plop
    xxxxxxxxxxxxMMMMxxxxxxxxxxxxxxxxxxxxxxxxxxxxMMMMxxxxxxxxxx
    
    $ i=1;while read line;do echo "$line > fich${i}";((i++));done < <(sed 's/MMMM/\n/g' plop)
    xxxxxxxxxxxx > fich1
    xxxxxxxxxxxxxxxxxxxxxxxxxxxx > fich2
    xxxxxxxxxx > fich3

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2003
    Messages : 22
    Par défaut
    Merci pour la suggestion
    Mais oui mais non pour la mise en oeuvre.
    Il faut que je garde le marqueur de fin et pas que je le remplace car ce
    marqueur de fin est le dernier enregistrement du fichier "logique".
    C'est pourquoi je n'avais pas opté pour sed. Il ne me renvoie pas de
    position pour une coupure efficace. (il me faut la position)
    C'est également la raison qui m'a poussée à parcourir la chaine.
    Mais en bash ça va pas vite...
    Evidement avec sed ou peut etre awk ca permettrait d'accélerer
    notablement le code.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    À partir de ton exemple plus haut, dis-nous exactement ce que tu veux obtenir en sortie...

    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed 's/MMMM/&\n/g' plop
    xxxxxxxxxxxxMMMM
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxMMMM
    xxxxxxxxxx

  7. #7
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2003
    Messages : 22
    Par défaut
    Merci pour ces diverses suggestions.
    Je vais procéder de la façon suivante :
    - recherche avec sed et remplace MMMM avec MMMM&\n
    - lecture de la taille de la chaine qui se termine par MMMM&\n
    = obtention de la position recherchée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Solution pour automatiser et optimiser en bash des commandes telnet
    Par hackmed dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 13/05/2015, 12h31
  2. Optimisation code bash
    Par yoyolichalu dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 16/12/2009, 10h29
  3. Bash: optimisation d'un if
    Par jmelyn dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 14/03/2008, 08h55
  4. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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