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

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    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 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,

    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 éminent

    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
    Points : 6 276
    Points
    6 276
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    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 273
    Points : 12 708
    Points
    12 708
    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.
    Cordialement.

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    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é.

  6. #6
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    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

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    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 273
    Points : 12 708
    Points
    12 708
    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.
    Cordialement.

  8. #8
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut bad substitution
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #!/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 "Genere SQl " >> ${FIC_LOG}
     
     
    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="${Ligne_FIC_IN:0:3}"
    	#echo "ENTITE-->"$entite 
     
    	if [ $entite == "000" ];
    	then
    		echo "Ligne_FIC_IN :"$Ligne_FIC_IN
    		numemet= "${Ligne_FIC_IN:5:14}" 
    		numdest= "${Ligne_FIC_IN:27:14}" 
    		echo "numemet: "$numemet
    		typapp="${Ligne_FIC_IN:47:2}"
    		normeps="${Ligne_FIC_IN:61:2}"
    	else
    		niveau="${Ligne_FIC_IN:3:2}"
    		if [ $entite == "999" ];
    		then
    			echo "FIN de fichier-->"$entite 
    		else
    		if [ $entite == "990" ] && [ $niveau == "02" ];
    		then
    			#echo "ENTITE-->"$entite"/"$niveau 
    			noecpt="${Ligne_FIC_IN:22:9}"  
    			noecum="${Ligne_FIC_IN:30:10}"  
    			#creer le fichier de sortie sql
    			echo "select * from CdcomE " >> CodeSQL_*.sql
    			echo "where ">> resultat.sql 
    			echo "NUMEMET='"$numemet"'  ">> CodeSQL_*.sql
    			echo "and numdest='"$numdest"'  ">> CodeSQL_*.sql
    			echo "and JCODATE='"$jcodate"'  ">> CodeSQL_*.sql
    			echo "and typapp='"$typapp"'  ">> CodeSQL_*.sql
    			echo "and normeps='"$normeps"'  ">> CodeSQL_*.sql
    			echo "and mut010='"$mut010"'  ">> CodeSQL_*.sql	
    			echo "and noecpt='"$noecpt"'  ">> CodeSQL_*.sql	
    			echo "and noecum='"$noecum"'  ">> CodeSQL_*.sql	
     
    			else
    				if [ $entite == "010" ];
    				then
    					mut010="${Ligne_FIC_IN:5:9}" 
    				fi
    				if [ $entite == "007" ] && [ $niveau == "02"];
    				then
    					jcodate="${Ligne_FIC_IN:5:6}"
    				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}


    lorsque je lance le script j obtient ----> IDEN.ksh[40]: entite="${Ligne_FIC_IN:0:3}": bad substitution

    et je ne suis pas sous linux sous lorsque je redige ces messages

    sous linux

    Résultat

    Fichier :fic2.err
    Ligne_FIC_IN :000QA 0A24S000B65D05XU00000055222333 XZ 091015157 000NU 128 201509
    IDEN.ksh: ligne 47: 0A24S000 : commande introuvable
    IDEN.ksh: ligne 48: 00000055222333 : commande introuvable
    numemet:
    FIN de fichier-->999


    le fichier
    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
     
    000QA      0A24S000B65D05XU00000055222333      XZ      091015157 000NU            128      201509                               
    0100155222333@
    07002020915@
    150111111111@
    150111111111@
    150111111111@
    99002300915           0000000300000031155P@
    07002030915@
    150111111111@
    150111111111@
    150111111111@
    99002300915           0000000300000031155P@
    9900155222333         0000001900000201158P@
    999QA      0A24S000B65D05XU00000044222467      RP      00000913                   00100000265065P

  9. #9
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    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.
    je n'utilise pas linux pour ces scripts mais sous AIX

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    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 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Les 2 erreurs lignes 47 et 48 => il ne faut jamais mettre d'espace à gauche et à droite du "=" lorsque l'on set une variable
    Je pense que tu as fait une typo à la ligne 64 (tu ne rediriges pas dans le bon fichier).

    Personnellement, je transposerais toute la boucle while en awk...
    Cordialement.

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    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 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Voici un exemple (ATTENTION: j'ai modifié le if 007 par if 070 car il n'y a pas de ligne commençant par 007 dans ton exemple de fichier d'entrée):
    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
    $ cat fic.awk 
    #!/usr/bin/awk -f
    {entite=substr($0,1,3);
    if(entite == "000"){
    	print "Ligne_FIC_IN :"$0;
    	numemet=substr($0,6,14);
    	numdest=substr($0,28,14);
    	print "numemet: "numemet
    	typapp=substr($0,48,2);
    	normeps=substr($0,62,2);
    }
    else{
    	niveau=substr($0,4,2);
    	if(entite == "999"){
    		print "Fin de Fichier-->"entite;
    	}
    	else{
    		if(entite == "990" && niveau == "02"){
    			noecpt=substr($0,23,9);
    			noecum=substr($0,31,10);
    			print "select * from CdcomE " >> "CodeSQL.sql"
    			print "where " >> "CodeSQL.sql"
    			print "NUMEMET='"numemet"'  " >> "CodeSQL.sql"
    			print "and numdest='"numdest"'  " >> "CodeSQL.sql"
    			print "and JCODATE='"jcodate"'  " >> "CodeSQL.sql"
    			print "and typapp='"typapp"'  " >> "CodeSQL.sql"
    			print "and normeps='"normeps"'  " >> "CodeSQL.sql"
    			print "and mut010='"mut010"'  " >> "CodeSQL.sql"
    			print "and noecpt='"noecpt"'  " >> "CodeSQL.sql"
    			print "and noecum='"noecum"'  " >> "CodeSQL.sql"
     		}
    		else{
    				if (entite == "010"){
    					mut010=substr($0,6,9);
    				}
    				if (entite == "070" && niveau == "02"){
    					jcodate=substr($0,6,6);
    				}
    		}
    	}
    }
    }
    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 fic.xxx 
    000QA      0A24S000B65D05XU00000055222333      XZ      091015157 000NU            128      201509                               
    0100155222333@
    07002020915@
    150111111111@
    150111111111@
    150111111111@
    99002300915           0000000300000031155P@
    07002030915@
    150111111111@
    150111111111@
    150111111111@
    99002300915           0000000300000031155P@
    9900155222333         0000001900000201158P@
    999QA      0A24S000B65D05XU00000044222467      RP      00000913                   00100000265065P
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./fic.awk fic.xxx 
    Ligne_FIC_IN :000QA      0A24S000B65D05XU00000055222333      XZ      091015157 000NU            128      201509                               
    numemet:       0A24S000
    Fin de Fichier-->999
    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
    $ cat CodeSQL.sql 
    select * from CdcomE 
    where 
    NUMEMET='      0A24S000'  
    and numdest='00000055222333'  
    and JCODATE='020915'  
    and typapp='XZ'  
    and normeps='15'  
    and mut010='55222333@'  
    and noecpt='000000030'  
    and noecum='0000003115'  
    select * from CdcomE 
    where 
    NUMEMET='      0A24S000'  
    and numdest='00000055222333'  
    and JCODATE='030915'  
    and typapp='XZ'  
    and normeps='15'  
    and mut010='55222333@'  
    and noecpt='000000030'  
    and noecum='0000003115'
    Cordialement.

  12. #12
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut qid
    merci.

    Donc si je comprend bien on utilise awk dans ce cas.
    me reste avoir si cela fonctionne dans tous les cas de combinaison possible

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    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 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Ce n'est pas une obligation, c'est juste un conseil.

    Le faire en shell est tout à fait envisageable, par contre, si tu as beaucoup de flux à gérer, tu risques de rencontrer des problèmes de performance comparée à une solution awk.
    Cordialement.

  14. #14
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut AWK why not
    Donc passer par awk.

    après vérification mes tests sont erronés: je n'utilise pas bash mais ksh comme interface pour ces process

  15. #15
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    493
    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 : 493
    Points : 152
    Points
    152
    Par défaut Erreur entre KSh et Bash
    J'utilise ksh sur mon environnement et non bash .
    Pour simuler sur linux ubuntu les scripts du post comment puis-je faire?

  16. #16
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Donc passer par awk.

    après vérification mes tests sont erronés: je n'utilise pas bash mais ksh comme interface pour ces process
    C'était évident dès ton premier post, le script commençant par:

    ɹǝsn *sıɹɐlos*

  17. #17
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par dedalios Voir le message
    J'utilise ksh sur mon environnement et non bash .
    Pour simuler sur linux ubuntu les scripts du post comment puis-je faire?
    Pourquoi ne pas utiliser bash sous AIX?

    ksh88 n'est pas disponible pour Linux.
    ɹǝsn *sıɹɐlos*

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par dedalios 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
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #!/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 "Genere SQl " >> ${FIC_LOG}
     
     
    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="${Ligne_FIC_IN:0:3}"
    	#echo "ENTITE-->"$entite 
     
    	if [ $entite == "000" ];
    	then
    		echo "Ligne_FIC_IN :"$Ligne_FIC_IN
    		numemet= "${Ligne_FIC_IN:5:14}" 
    		numdest= "${Ligne_FIC_IN:27:14}" 
    		echo "numemet: "$numemet
    		typapp="${Ligne_FIC_IN:47:2}"
    		normeps="${Ligne_FIC_IN:61:2}"
    	else
    		niveau="${Ligne_FIC_IN:3:2}"
    		if [ $entite == "999" ];
    		then
    			echo "FIN de fichier-->"$entite 
    		else
    		if [ $entite == "990" ] && [ $niveau == "02" ];
    		then
    			#echo "ENTITE-->"$entite"/"$niveau 
    			noecpt="${Ligne_FIC_IN:22:9}"  
    			noecum="${Ligne_FIC_IN:30:10}"  
    			#creer le fichier de sortie sql
    			echo "select * from CdcomE " >> CodeSQL_*.sql
    			echo "where ">> resultat.sql 
    			echo "NUMEMET='"$numemet"'  ">> CodeSQL_*.sql
    			echo "and numdest='"$numdest"'  ">> CodeSQL_*.sql
    			echo "and JCODATE='"$jcodate"'  ">> CodeSQL_*.sql
    			echo "and typapp='"$typapp"'  ">> CodeSQL_*.sql
    			echo "and normeps='"$normeps"'  ">> CodeSQL_*.sql
    			echo "and mut010='"$mut010"'  ">> CodeSQL_*.sql	
    			echo "and noecpt='"$noecpt"'  ">> CodeSQL_*.sql	
    			echo "and noecum='"$noecum"'  ">> CodeSQL_*.sql	
     
    			else
    				if [ $entite == "010" ];
    				then
    					mut010="${Ligne_FIC_IN:5:9}" 
    				fi
    				if [ $entite == "007" ] && [ $niveau == "02"];
    				then
    					jcodate="${Ligne_FIC_IN:5:6}"
    				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}


    lorsque je lance le script j obtient ----> IDEN.ksh[40]: entite="${Ligne_FIC_IN:0:3}": bad substitution
    Hmmm. Je n'ai pas lu tous les posts en détails, mais s'il te dit qu'il a une erreur en ligne 40 qui correspond bien à entite="${Ligne_FIC_IN:0:3}", on devrait pouvoir en déduire que le shebang est en ligne 2 et non en ligne 1. Du coup, on ne peut pas être sûr qu'il exécute un ksh.

    Rappel: le shebang #!/bin/ksh doit être sur la première ligne du script (et non sur la 2ème)

  19. #19
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Hmmm. Je n'ai pas lu tous les posts en détails, mais s'il te dit qu'il a une erreur en ligne 40 qui correspond bien à entite="${Ligne_FIC_IN:0:3}", on devrait pouvoir en déduire que le shebang est en ligne 2 et non en ligne 1. Du coup, on ne peut pas être sûr qu'il exécute un ksh.
    Le message d'erreur "bad substitution" alors que la syntaxe est correcte pour bash ne laisse guère de doute sur le fait que ksh88 est utilisé.

    Rappel: le shebang #!/bin/ksh doit être sur la première ligne du script (et non sur la 2ème)
    C'est vrai mais l'absence de shebang fera que le script sera exécuté par le shell par défaut / POSIX du système, qui n'est sûrement pas bash sur AIX mais bien toujours ksh.
    ɹǝsn *sıɹɐlos*

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