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 :

Recherche fichier depuis fichier texte


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut Recherche fichier depuis fichier texte
    j'ai un fichier txt ned_update_img.csv de ce format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f1;f1a;rep_source
    f2;f2a;rep_source
    f3;f3a;rep_source
    j'aimerais testrer que si le champ2 exist dans la variable repertoire source
    ca m'affiche le champ2
    j'ai essayé avec ce code mais ca ne marche pas .
    je ne comprends rien.merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    rep_fich_img="/cygdrive/d/0temp/presta/ned_ajout_walk/img";
    while IFS=';' read -r champ1 champ2 champ3
    do
    	rep_source="/cygdrive/d/0temp/presta/ned_ajout_walk/img/$champ3"
    	for champ2 in "${rep_source}";
    	do
    		echo "$champ2"
    	done
     done < <(tr -d '\r' <$rep_fich_img/ned_update_img.csv)

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Bonjour

    je ne comprends rien.
    On peut te retourner cette phrase. Comment peux-tu définir champ2 dans une boucle et redéfinir champ2 dans une deuxième boucle imbriquée dans celle déjà citée ? Que vaut champ2 selon toi ?

    De plus, le "for" va prendre les éléments séparés d'espaces. Non ?
    Où sont les espaces dans "/cygdrive/d/0temp/presta/ned_ajout_walk/img/" ?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    Oui justement je ne sais pas ce que vaut champ2. ça me donne des résultats que je ne comprends pas.
    y a-t-il une solution plus simple ?

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat fichier
    f1;f1a;rep_source
    f2;f2a;ferff2arep_source
    f3;f3a;rep_source
    $ awk -F';' '($3 ~ $2){print $2;}' fichier                                                                         
    f2a

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    je ne comprends pas trop cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk -F';' '($3 ~ $2){print $2;}' fichier

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    Moi, je ne comprends même pas la question de départ...

    Peux-tu reformuler ton besoin avec des termes comme chaine de caractère ou fichier vis à vis de ton fameux champ2 ?

    Ou en posant la question plus simplement, champs2 doit il être un fichier dans le répertoire champs3 ou alors tu désire trouver la chaine de caractère dans la chaine contenant le champs3 ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    je plussoie.
    c'est pas clair, il faut être plus précis : utiliser un même terme pour un même objet.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    il n 'y a pas de solution plus facile à lire comme code?si je ne comprends pas je l'utiliserais pas car je ne saurais le corriger s'il y a un bug

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat fichier
    f1;f1a;rep_source
    f2;f2a;ferff2arep_source
    f3;f3a;rep_source
    $ awk -F';' '($3 ~ $2){print $2;}' fichier                                                                         
    f2a
    On peut aussi le faire avec grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '^[^;]*;([^;]*);[^;]*\K\1' fichier
    Là, on a juste une expression régulière, c'est peut-être plus simple à comprendre

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Moi, je ne comprends même pas la question de départ...
    Peux-tu reformuler ton besoin avec des termes comme chaine de caractère ou fichier vis à vis de ton fameux champ2 ?

    Ou en posant la question plus simplement, champs2 doit il être un fichier dans le répertoire champs3 ou alors tu désire trouver la chaine de caractère dans la chaine contenant le champs3 ?
    le champ2 doit être un fichier dans le répertoire champ3
    si le fichier de la variable champ2 est dans le repertoire de la variable champ3 et ben je ne fais rien
    si le fichier de la variable champ2 n'est pas dans le repertoire de la variable champ3 et ben je copie
    exemple
    si le fichier f1a n'est pas dans le repertoire rep_source et bien je copie f1 en f1a dans le repertoire rep_source

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    Ok, c'est plus clair.
    Maintenant, dans ton explication, tu ne fais que:
    si ceci alors cela

    Ça ne ressemble pas beaucoup à une boucle for mais plus à des if voir même un seul en posant le problème correctement.

    Ici, je ne remets pas en cause la boucle while: elle est là pour traiter chaque ligne.

    En shell, il existe une commande qui permet de tester l'inexistence d'un fichier, c'est la commande test ! -f fichier ou les syntaxes dérivées telles que:
    [ ! -f fichier ] ou [[ ! -f fichier ]].
    et tu couples ça à un if, cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [[ ! -f fichier ]]
    then
      echo ...
    fi
    ne te reste plus qu'à remplacer fichier, dans l'exemple, par le chemin complet de champ2 qui ce trouve dans le répertoire champ3...

  12. #12
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    j'ai essayé comme celà mais est la meilleurs solution la plus optimisée et rapide?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    rep_fich_img="/cygdrive/d/0temp/presta/ned_ajout_walk/img";
    while IFS=';' read -r champ1 champ2 champ3
    do
    	fich="/cygdrive/d/0temp/presta/ned_ajout_walk/img/$champ3/$champ2"
    	if [[ ! -f "$fich" ]] 
          then
    		echo "$champ1"
    	fi
     done < <(tr -d '\r' <$rep_fich_img/ned_update_img.csv)

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    En shell, je dirais oui et surtout la plus simple à maintenir...

    Après, la notions de plus rapide, ça dépend aussi de la quantité de fichiers que tu as à traiter et la taille de ceux-ci.

    On pourrait utiliser une méthode à multiple processus pour gérer plusieurs fichiers à la fois mais si tu travailles sur le même disque, tu auras une latence plus ou moins importante sur les I/O ce qui ne te fera pas gagner énormément de temps pour par exemple une cinquantaine de fichiers.

    Et il est pratiquement inutile de lancer plus de processus que de nombre de core cpu et non utilisé.

    En bref, la réponse n'est pas simple, elle dépend de ton architecture et de ton exploitation.

    Déjà là, le script prend combien de temps à tourner et sur combien de fichier à traiter ?

  14. #14
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    le fichier ned_update_img.csv contient 2000 lignes.j'espère que la requete if n'est pas trop lente

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    Si ta version de cp à l'option -n, tu peux te passer du if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while IFS=';' read -r champ1 champ2 champ3
    do
    	cp -n "$champ1" "/cygdrive/d/0temp/presta/ned_ajout_walk/img/$champ3/$champ2"
    done < <(tr -d '\r' <$rep_fich_img/ned_update_img.csv)
    Copiera le fichier de $champ1 sous le nom de $champ2 dans le répertoire de $champ3 si le fichier de $champ2 n'existe pas.

    Attention: je ne sais pas ce que sont les valeurs de ton champ1, donc à compléter...

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    merci disedorgue pas besoin de if .c'est une bonne idée.si je peux te mettre 3 points sur ta réponse je le fais avec plaisir

  17. #17
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    je ne trouve pas à quoi sert -n de cp -n

  18. #18
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 429
    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 429
    Par défaut
    D'où ma réponse, si ton cp a l'option -n car celle-ci n'est pas spécifiée dans le man.

    Par contre tu peux la voir en faisant cp --help.

Discussions similaires

  1. Recherche dans un fichier texte
    Par Yazoo70 dans le forum C++
    Réponses: 7
    Dernier message: 12/06/2007, 08h31
  2. recherche dans un fichier texte en perl(débutant)
    Par Shyboy dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2006, 23h53
  3. [VB]Recherche dans un fichier texte
    Par mirascheat dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 26/09/2005, 12h11
  4. Recherche dans un fichier texte volumineux.
    Par Actarus69 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 27/07/2005, 17h39
  5. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57

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