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 :

[Débutant] Options sed et variables


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Par défaut [Débutant] Options sed et variables
    Bonjour,

    j'ai quelques difficultés à gérer les variables de mon script et je n'ai pas trouvé de solutions...

    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
    #!/bin/bash
     
    ##n_line= wc -l mon_fichier
    ##n_line=$(wc -l mon fichier | cut -f1 -d$'\t')
    ##echo $n_line
    indice=0
    ##k=(($indice+5000))
    x=1
     
    while ((n_line > $indice))
    do
    k=($indice+5000)
    ##echo $indice
    ##echo $n_line
    sed -n ('$(indice),$(kp)' mon_fichier > mon_fichier$x.txt
    ##$indice+=5000
    indice=$(($indice + 5000))
    ((x++))
    done
    bonjour voila mon code je souhaiterais diviser un fichier en plusieurs fichiers de 5000 lignes
    le problème c'est que j'arrive pas à utiliser le sed qui ne veut pas pas prendre les variables $indice et $k en options...
    (par la même occasion je n'arrive pas non plus à récupérer le nombre de ligne de mon fichier avec la commande wc -l qui me renvoie aussi le nom du fichier...)

    Merci à vous pour votre aide !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    La ligne en cause est donc celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ('$(indice),$(kp)' mon_fichier > mon_fichier$x.txt
    Première incongruité : une parenthèse ouvrante qui ne correspond à rien.

    Ensuite, les paramètres sont encadrés d'apostrophes (single quote) qui bloquent l'expansion des variables alors qu'il aurait fallu utiliser des guillemets (double quote)...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    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
    16
    17
    $ cat aze 
    1
    2
    3
    4
    5
    6
    $ split -n3 aze
    $ cat xaa 
    1
    2
    $ cat xab
    3
    4
    $ cat xac
    5
    6
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par ggnore Voir le message


    split -l5000 fichier prefixe, plus court, plus simple, plus rapide.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    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
    16
    17
    18
    19
    20
    #!/bin/bash
     
    ##n_line= wc -l mon_fichier.txt
    ##my_str= wc -l mon_fichier.txt
    ##n_line=$(echo $my_str | cut -f1 -d$' ')
    ##echo $n_line
    indice=0
    ##k=(($indice+5000))
    x=1
     
    while [[ 22332 -gt $indice ]]
    do
    k=( $indice + 5000 )
    ##echo $indice
    ##echo $n_line
    sed -n "$indice,'$k'p" mon_fichier.txt
    ##$indice+=5000
    indice=$(($indice + 5000))
    ((x++))
    done
    oui en effet il y a une parenthèse en trop, j'ai modifié la ligne de commande sed comme ceci, mais le terminal me renvoie ce message:

    sed: 1: "20000,p": expected context address

    edit:

    j'ai placé des accolades comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n "$indice,${k}p" mon_fichier.txt
    ça marche mieux,

    par contre pour le wc -l j'ai redirigé mais la variable contient une tabulaiton

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il reste des erreurs dans ce script :
    ligne 13 : les calculs arithmétiques s'effectuent à l'intérieur de doubles parenthèses précédées du signe $ pour récupérer le résultat (voir ligne 18)
    ligne 16 : il doit y avoir un espace entre l'identification des lignes à traiter et la commande

    Compte tenu de ce que fait ton script, la solution proposée par ggnore est en effet beaucoup plus pratique.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 48
    Par défaut
    oui j'ai corrigé,

    mais je n'ai pas réussi à récupérer ma variable depuis la commande wc ...
    tant pis ce n'est pas grave !

    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
    #!/bin/bash
     
    ##n_line= wc -l < mon_fichier.txt
     
    indice=1
    x=1
     
    while [[ 75133 -gt $indice ]]
    do
    k=$(($indice + 4999))
    echo $indice
    echo $k
    echo $x
     
    sed -n "$indice,${k}p" mon_fichier.txt > mon_fichier_$x.txt
     
    indice=$(($indice + 5000))
    ((x++))
    done

    Merci pour votre aide !!

    Bonne journée

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par TrafalgarD Voir le message
    mais je n'ai pas réussi à récupérer ma variable depuis la commande wc ...
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (...)
    ##n_line= wc -l < mon_fichier.txt
    (...)
    (...)
    Pour récupérer le résultat d'un commande dans une variable, on utilise $()
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par TrafalgarD Voir le message
    (par la même occasion je n'arrive pas non plus à récupérer le nombre de ligne de mon fichier avec la commande wc -l qui me renvoie aussi le nom du fichier...)
    C'est le fonctionnement normal de wc d'afficher le nom du fichier à la suite du comptage effectué.
    Pour éviter cela, il suffit d'effectuer le comptage sur l'entrée standard : wc -l < mon_fichier
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Mettre la valeur d'un bouton d'option dans une variable
    Par beegees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 01/03/2006, 10h00
  2. [HTML][Débutante]Couleur de texte variable
    Par master56 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 05/10/2005, 15h04
  3. Réponses: 5
    Dernier message: 25/06/2005, 11h35
  4. Réponses: 8
    Dernier message: 05/05/2004, 16h28
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

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