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 :

Supprimer n lignes d'un fichier.txt et les renvoyer dans un autre fichier


Sujet :

Shell et commandes GNU

  1. #21
    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 disedorgue Voir le message
    C'est surtout que wc -l affiche aussi le nom de fichier et donc pour comparer avec un nombre...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ wc -l fich1.xml
    6 fich1.xml
    Et c'est là que la redirection entre en jeu (tout comme pour "tr) :

    $ man woman
    Il n'y a pas de page de manuel pour woman.

  2. #22
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    j'ai essayé avec wc mais ca me retourne l'erreur "too many arguments"
    est ce que tu peux m'expliquer que signifie les deux erreurs que j'ai mentionnées. Ca m'aiderai peut être a localiser le probleme.

    merci

  3. #23
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    J'y ai pensé après avoir répondu...
    Après j'ai utilisé le sed car j'étais plus dans cet état d'esprit à ce moment là.
    Par contre, a priori, après quelque test, le wc -l avec la redirection est plus rapide que le sed. sur un fichier de 25000 ligne environ et de taille 12Mo:
    wc: 0,007 secondes
    sed: 0,017 secondes

    Il vaut mieux donc utiliser "wc" que "sed"
    Cordialement.

  4. #24
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    HéHé!!!, je vous laisse répondre car j'avais aussi la flemme d'expliquer le coup de la redirection
    Cordialement.

  5. #25
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    j'ai essayé avec la commande wc mais j'ai une erreur (too many argument).
    est que tu peux m'expliquer les deux erreurs que j'ai mentionnées peut être que j'arriverai à les résoudre si je comprend de quoi il s'agit.

    merci

  6. #26
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    dsl d'avoir posté deux fois j'ai eu un probleme avec mon ordinateur.
    SVP aidez mio a faire fonctionner mon script

  7. #27
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Je pensais que c'était résolu
    Après tous ces échanges, ton script a dû pas mal changer, il serait plus simple que tu nous le montres et que tu nous dises ce qui ne va pas encore dedans.
    Cordialement.

  8. #28
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    voila mon script final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while [ $(wc -l  $1) -lt "1000" ]
    do
      echo "on attend 10 secondes"
      sleep 10
    done
    sed -n -e '1,1000p;1001q' $1 > $2
    sed '1,1000d' $1 -i
    il ne fonctionne pas: j'ai une erreur de type "too many arguments at line 1"
    si je change la première ligne avec [ $(sed -n -e "$=" $1) -lt "1000" ], j'ai une erreur de type "interger expected at line 1)

    merci beaucoup pour votre aide

  9. #29
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Concernant la mise en pause du script, c'est possible en envoyant un signal STOP au processus et ensuite, il suffirait de renvoyer un signal CONT mais ceci n'est pas du tout propre
    De toute façon, qu'y a-t-il de propre à modifier un fichier en cours de fabrication?

    Question: Est-ce que des méthodes comme celles-ci suffisent pour qu'un processus attende l'autre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Ma_classe_java | mon_script.bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Ma_classe_java && mon_script2.bash
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #30
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Alors, il faut rester cohérent coté syntaxe:

    pour le cas sed, je n'ai pas écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ $(sed -n -e "$=" $1) -lt "1000" ]
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ "$(sed -n -e '$=' $1)" -lt "1000" ]
    Sinon, pour la cas wc, il faut faire une redirection et aussi être cohérent coté syntaxe, donc:
    remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ $(wc -l $1) -lt "1000" ]
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ "$(wc -l <$1)" -lt "1000" ]
    Cordialement.

  11. #31
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    De toute façon, qu'y a-t-il de propre à modifier un fichier en cours de fabrication?

    Question: Est-ce que des méthodes comme celles-ci suffisent pour qu'un processus attende l'autre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Ma_classe_java | mon_script.bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java Ma_classe_java && mon_script2.bash
    Personnellement, je bannis les 2 méthodes, principalement a cause d'un mode de fonctionnement très courant en java qui est de créer un processus fils et de rendre la main en laissant le fils continuer tout seul.
    Ou bien ces process java sont destinés à tourner 24/24, donc le script derrière risque d'attendre longtemps pour le 2éme cas et pour le premier cas, en mon sens, il n'y a pas d'attente pour un script qui n'attend pas d'entrée (faudrait que je teste un jour pour voir).
    Cordialement.

  12. #32
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    Merci énormément ça fonctionne très bien je n'ai pas de bug au niveau d'erreur retournée en code java. Il reste juste à voir si ça retourne le résultat demandé mais ça, ça relève du java et non du shell.

    Donc voila merci beaucoup je vais laisser le sujet ouvert si jamais je veux apporter des modifications sur le script.

    Merci.

  13. #33
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    bonjour,
    J'ai apporté une nouvelle modification sur mon script shell. Je veux qu'il soit exécuté tant que le fichier passé en paramètre n'est pas encore vide.
    le problème est que les deux boucles imbriquées (while) ne fonctionnent pas correctement : quand mon fichier devient vide la boucle est toujours exécutée !!

    voila le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while [ -s $1 ]
    do
     
       while [ "$(wc -l <$1)" -lt "1000" ]
       do
         echo "on attend 10 secondes pour le fichier $1"
         sleep 10
      done
    echo "fichier $1 prêt, MAJ de $2"
    sed -n -e '1,1000p;1001q' $1 > $2
    sed '1,1000d' $1 -i
     
    done
    quand le fichier $1 devient vide j'ai toujours le message suivant qui s’affiche sans arrêt "on attend 10 secondes pour le fichier $1"

    merci pour votre aide!

  14. #34
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    Pour ta première boucle, le fichier ne sera jamais vide, puisque la deuxième attend que le fichier possède au moins 1001 ligne (l'option -gt) et que tu ne retires que 1000 lignes, il restera donc automatiquement au moins une ligne dans ton fichier initial.

    Donc ici, ce n'est pas le script le problème, c'est une partie de l'algorithme.

    Il manque une étape:
    Dans quel cas le fichier se retrouve vide ?
    Cordialement.

  15. #35
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    au fait le fichier est remplie par une requête shell SNMP WALK.
    lorsque la requête stocke 1000 lignes dans le fichier, des dernière sont transférées vers un autre fichiers. et ainsi de suite jusqu'a ce que la requête soit terminée. donc normalement lorsque SNMP walk s'arrête le fichier se retrouve vidé.

  16. #36
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Pour ta première boucle, le fichier ne sera jamais vide, puisque la deuxième attend que le fichier possède au moins 1001 ligne (l'option -gt) et que tu ne retires que 1000 lignes, il restera donc automatiquement au moins une ligne dans ton fichier initial.
    le premier while exécute le contraire de ce que tu dit au fait while [ -s $1 ] veut dire tant que le fichier n'est pas encore vide

  17. #37
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    En effet, au lieu de -gt c'est -lt, donc 1000 lignes:
    tu es sur que ton shell SNMP WALK se termine sur un multiple de 1000 lignes ?

    Sinon, le fichier ne sera jamais totalement vide...
    Cordialement.

  18. #38
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    Au fait j'ai trouvé la source du probleme mais je ne sais pas comment la corriger.
    le probleme vient du fait que lorsque je supprime 1000 lignes du fichier d'origine la requête responsable de remplir ce dernier se bloque c'est ce qui fait qu'il n'y a plus aucune ecriture dans le fichier et c'est pourquoi je vais attendre indéfiniment.

    j'ai testé à la main plusieurs fois et apparament a chaque fois que j'essaie de modifier un fichier en cours d'écriture, la requête qui le rempli se bloque ( je dis bien se bloque, je n'ai pas un retour de promp)

    s'il te plait qu'est ce que je peux faire, si je n'arrive pas à résoudre ceci ca va m'obliger a changer l'algorithme du script

  19. #39
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Peux tu essayer de remettre ton fichier à zéro pendant que ton process s'execute et me dire si celui-ci se bloque ?
    La méthode pour remettre un fichier à zéro sans en principe modifier l'inode du dit fichier, c'est de faire une simple redirection dessus:
    Cordialement.

  20. #40
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Points : 13
    Points
    13
    Par défaut
    non ça bloque aussi car c'est équivalent a supprimer la totalité du fichier.
    Au fait j'ai pensé a une autre méthode, au lieu de supprimer 1000 lignes et les transférer dans un autres fichier, je pourrais juste les copier sans modifier le fichier de départ. la difficulté est d'imposer la copie de 1000 ligns en se souvenant de l'index de la dernière ligne copiée. j'ai réalisé ce script, mais il ne compile pas correctement

    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
    sed -n '$=' $1 > size
    while read line
    do
    taille=$line
    done < size
    rm size
    dernier_index=1
       while [ "$taille" -lt "$(expr $taille + 1000)" ] # tant que il n'a ya pas ajout de 1000 dernière lignes dans le fichier
       do 
         echo "attendre que 1000 nouvelles lignes soient rajoutées dans $1"
         sleep 10
       done
     
     echo "1000 nouvelles lignes viennent d'être rajoutées dans $1, le fichier $2 est prêt"
     sed -n -e '$dernier_index,1000p' $1 > $2
     dernier_index=$(expr $dernier_index + 1000)
    le problème est que quand j'ajoute les 1000 nouvelles lignes dans $1 la boucle while s'exécute toujours, elle ne détecte pas l'ajout

    merci

Discussions similaires

  1. Récuperer les données d'un fichier txt pour les insérer dans une Table
    Par sandokhane dans le forum Bases de données
    Réponses: 47
    Dernier message: 31/05/2014, 15h10
  2. Réponses: 6
    Dernier message: 17/02/2014, 11h14
  3. [XL-2007] Extraire des lignes en fonction d'une valeur de cellule dans un autre fichier
    Par MisterTambo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/08/2009, 10h42
  4. [OpenOffice][Base de données] Récupérer les données d'un fichier .txt et les insérer dans une base de données
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 05/08/2009, 10h52
  5. Indexer un fichier txt dans un autre fichier txt
    Par dimitri1233 dans le forum Langage
    Réponses: 1
    Dernier message: 22/12/2006, 16h06

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