Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/07/2011, 19h55   #1
Invité régulier
 
Inscription : septembre 2003
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 20
Points : 6
Points : 6
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
nadine.mauch est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/07/2011, 22h28   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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

__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/07/2011, 09h43   #3
Invité régulier
 
Inscription : septembre 2003
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 20
Points : 6
Points : 6
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 ...
nadine.mauch est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 09h51   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
En espérant avoir tout compris et en reprenant ton exemple, un traitement à base de "sed" me semble tout approprié :

Code :
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/07/2011, 11h02   #5
Invité régulier
 
Inscription : septembre 2003
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 20
Points : 6
Points : 6
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.
nadine.mauch est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 11h50   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
À partir de ton exemple plus haut, dis-nous exactement ce que tu veux obtenir en sortie...

Sinon :

Code :
1
2
3
4
$ sed 's/MMMM/&\n/g' plop
xxxxxxxxxxxxMMMM
xxxxxxxxxxxxxxxxxxxxxxxxxxxxMMMM
xxxxxxxxxx
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/07/2011, 17h57   #7
Invité régulier
 
Inscription : septembre 2003
Messages : 20
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 20
Points : 6
Points : 6
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
nadine.mauch est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h41.


 
 
 
 
Partenaires

Hébergement Web