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 POSIX Discussion :

Sed est ses mystères Quand les espaces disparaissent


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Sed est ses mystères Quand les espaces disparaissent
    Nom du script: ident
    Compatible avec: Bash

    Descriptif: extraction de données

    Pré-requis: aucun

    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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #!/bin/ksh
     
    #***************************************************************************
    #* Parametres                                                              *
    #***************************************************************************
     
    #Variable :
    NOW=`date +"%Y%m%d%H%M%S"`
    #Arborescence serveur :
    DIR=${HOME}/utils/ID_doublon 
    DIR_LOG=${DIR}/log
    FIC_LOG=${DIR_LOG}/identific_doublon_$NOW.log
    DIR_SQL=${DIR}/sql
    FIC_RES=${DIR}/donnees_fichier_doublon.csv
    $i=0
     
     
    # Verification de la presence des parametres de lancement
    if [ $# -ne 1 ];
      then
        echo "  ==> Veuillez entrer le nom du fichier a analyser suivi de la norme "  >> $log
        exit 9
     
    fi
     
    # Acquisition des parametre
    FIC_IN=$1
     
    echo "Demarrage de la mise au format du flux " >> ${FIC_LOG}
    rm CodeSQL_*.sql
     
    echo "Fichier :"$FIC_IN
     
    while read Ligne_FIC_IN;
    do
    	#echo $Ligne_FIC_IN 
    	#extraction des donnees de la ligne de type 000
    	echo $Ligne_FIC_IN > typ000.txt
    	entite=`cut -c 1-3 typ000.txt`
    	#echo "ENTITE-->"$entite 
     
    	if [ $entite == "000" ];
    	then
    		echo "Ligne_FIC_IN :"$Ligne_FIC_IN
    		numemet=`cut -c 6-19 typ000.txt`
    		echo "numemet: "$numemet
    		numdest=`cut -c 28-41 typ000.txt`
    		typapp=`cut -c 48-49 typ000.txt`
    		normeps=`cut -c 62-64 typ000.txt`
    	else
    		niveau=`cut -c 4-5 typ000.txt`
    		if [ $entite == "999" ];
    		then
    			echo "FIN de fichier-->"$entite 
    		else
    		if [ $entite == "990" ] && [ $niveau == "02" ];
    		then
    			#echo "ENTITE-->"$entite"/"$niveau 
    			noecpt=`cut -c  23-30 typ000.txt` 
    			noecum=`cut -c  31-41 typ000.txt`
    			#creer le fichier de sortie sql
    			else
    				if [ $entite == "010" ];
    				then
    					mut010=`cut -c 6-13 typ000.txt`
    				fi
    				if [ $entite == "007" ] && [ $niveau == "02"];
    				then
    					jcodate=`cut -c 6-11 typ000.txt`
    				fi
    			fi
    		fi
    	fi
    done  < $FIC_IN
     
     
    echo "Fin de la mise au format du flux " > ${FIC_LOG}
     
    echo " " >> ${FIC_LOG}
    echo "Fin du script : " `date +"%d/%m/%Y %H:%M:%S"` >> ${FIC_LOG}

    ------------------------------------------------
    résultat


    soit le Fichier :fic2.err fichier utilisé avec comme contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    000MA      02241000B65D05MU00000055222333      RP      091015687 000NU            128      201509                               
    0100155222333@
    07002020915@
    150111111111@


    pourquoi sur la commande "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read Ligne_FIC_IN;
    do
    echo $Ligne_FIC_IN 
    ....
     done  < $FIC_IN
    ",

    on passe du texte suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    000MA      02241000B65D05MU00000055222333      RP      091015687 000NU            128      201509
    a ce text
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    000MA 02241000B65D05MU00000055222333 RP 091015687 000NU 128 201509

    pourquoi des espaces disparaissent ?????

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Bonjour,

    pourquoi des espaces disparaissent ?????
    parce que tes variables ne sont pas entre guillemets; ce qui devrait toujours être le cas, à moins de savoir pourquoi !

    edit :
    elle est où ta commande sed qui devrait poser problème ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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,
    Citation Envoyé par N_BaH Voir le message
    elle est où ta commande sed qui devrait poser problème ?
    Le mystère reste entier… et s'épaissit, elle a elle aussi disparu dans l'espace

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Blagues à part, il y a des choses à corriger, car le script est loin d'être propre même s'il fait le boulot.

    Déjà, l'utilisation d'un fichier pour y insérer une seule ligne et derrière ne faire que des cut, c'est du gaspillage, moins souple et plus risqué que d'utiliser un pipe "|".
    En plus ici, même la commande cut n'est pas obligatoire (au moins en ksh93), tu peux le remplacer par une gestion de variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ Ligne_FIC_IN="000MA      02241000B65D05MU00000055222333      RP      091015687 000NU            128      201509"
    $ entite="${Ligne_FIC_IN:0:3}"
    $ numemet="${Ligne_FIC_IN:5:14}"
    $ echo "$entite"
    000
    $ echo "$numemet"
          02241000
    $ echo "$Ligne_FIC_IN" | cut -c6-19
          02241000
    La syntaxe est ${Nom_de_variable:offset de 0 à n:longueur}Et quand on fait des tests sur des chaînes de caractères, on protège les variables par des guillemets pour la bonne et simple raison qu'une chaîne vide n'est pas le vide tout court.

  5. #5
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut (au moins en ksh93
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Blagues à part, il y a des choses à corriger, car le script est loin d'être propre même s'il fait le boulot.

    Déjà, l'utilisation d'un fichier pour y insérer une seule ligne et derrière ne faire que des cut, c'est du gaspillage, moins souple et plus risqué que d'utiliser un pipe "|".
    En plus ici, même la commande cut n'est pas obligatoire (au moins en ksh93), tu peux le remplacer par une gestion de variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ Ligne_FIC_IN="000MA      02241000B65D05MU00000055222333      RP      091015687 000NU            128      201509"
    $ entite="${Ligne_FIC_IN:0:3}"
    $ numemet="${Ligne_FIC_IN:5:14}"
    $ echo "$entite"
    000
    $ echo "$numemet"
          02241000
    $ echo "$Ligne_FIC_IN" | cut -c6-19
          02241000
    La syntaxe est ${Nom_de_variable:offset de 0 à n:longueur}Et quand on fait des tests sur des chaînes de caractères, on protège les variables par des guillemets pour la bonne et simple raison qu'une chaîne vide n'est pas le vide tout court.

    comment savoir que l'on est sur au moins en ksh93. 1993 effectivement cela ne date pas d'hiers mais sur Unix comment puis-je savoir la version du Shell.
    j'ai testé l'option du style $ numemet="${Ligne_FIC_IN:5:14}" est dans mon souvenir cela ne fonctionné pas

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Par curiosité, c'est quoi ton système d'exploitation car sous linux, je doute que tu sois en ksh88 ?

    Juste pour information, c'est compatible bash cette forme de découpage par variable (rapport à ton post initial).

    Sinon, à part initialiser des variables, il fait quoi d'autre le script ?

    Elles servent à quoi après ces variables ?

    Selon le besoin final, il serait peut-être mieux de passer par un script sed ou awk.

  7. #7
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut erreur de titre
    Citation Envoyé par N_BaH Voir le message
    Bonjour,


    parce que tes variables ne sont pas entre guillemets; ce qui devrait toujours être le cas, à moins de savoir pourquoi !

    edit :
    elle est où ta commande sed qui devrait poser problème ?
    Il n'y a effectivement pas de SED dans ce code une erreur de ma part .
    Les Sed ont pourtant existé mais sans me donner le résultat escompté.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/01/2013, 18h33
  2. Réponses: 12
    Dernier message: 22/12/2011, 06h16
  3. Réponses: 4
    Dernier message: 27/11/2008, 02h03
  4. Gérer les espaces avec SED
    Par byloute dans le forum Linux
    Réponses: 7
    Dernier message: 29/10/2005, 19h07

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