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 :

Fichier de sortie d'une boucle doit devenir le fichier d'entrée au tour d'après


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut Fichier de sortie d'une boucle doit devenir le fichier d'entrée au tour d'après
    Bonsoir à tous,
    En désespoir de cause, je viens voir si je peux trouver de l'aide ...
    Mon problème : j'ai un fichier de départ FD et n fichiers F1, F2, ..., Fn (tous a un seul champ).
    Je veux filtrer dans FD toutes les lignes existantes dans F1 = > créer un fichier Res1
    Prendre Res1 : filtrer tout ce qui existe dans F2 => créer Res2
    Prendre Res2 : filtrer tout ce qui existe dans F3 .....pour au final avoir un fichier de départ FD filtré de tout ce qui existe dans les n fichiers F1, F2, ..., Fn

    Ce qui veut dire que le fichier de sortie de ma boucle devient le .... fichier d'entrée au tour d'après !
    Et ça marche pas ....
    Chaque fichier fait ~500 000lignes donc je me suis dit que mes fichiers devenant de plus en plus petits, j'irais de plus en plus vite ....
    Ce que j'ai fais :
    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
     
    #!/bin/bash
    # Prend 2 arguments : le nom du fic a filtrer (pas son chemin) et un dossier qui contient les fichiers qui vont servir à filtrer. 
    # NB : le fic a filtrer est aussi dans le dossier qui contient les fichiers filtrants 
     
    FICHIERS=$(ls $2)
    tmp=$1
    cpt=1
    for fichier in $FICHIERS
    do
    	if [ "$fichier" != "$1" ]
    	then
    	echo "Fichier trouve : $fichier"
     
    	>resFiltration$cpt
     
    	while read line
    	do
    		if ! grep -q -m 1 "$line" $2/$fichier		# si la ligne n'est pas au moins une fois dans le fichier
    		then
    			echo $line >> resFiltration$cpt
    		fi
    	done < $tmp	# on envoie $tmp sur l'entree standard du while
     
    		((cpt++))
    		tmp=$"resFiltration$cpt"
    		echo "new tmp :$tmp"
    	fi
    done
    Si vous avez une aide à m'apporter... merci infiniment !
    Bonne soirée
    CarréNoir

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

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

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    shopt -s extglob nullglob
    result=$(<FD)
    for f in !(FD); do result=$(echo "$result" | grep -of - "$f"); done
    echo "$result"
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CarreNoir Voir le message
    Je veux filtrer dans FD toutes les lignes existantes dans F1 = > créer un fichier Res1
    Prendre Res1 : filtrer tout ce qui existe dans F2 => créer Res2
    Prendre Res2 : filtrer tout ce qui existe dans F3 .....pour au final avoir un fichier de départ FD filtré de tout ce qui existe dans les n fichiers F1, F2, ..., Fn
    Bonsoir

    Pourquoi ne pas directement filtrer dans FD toutes les lignes se trouvant dans (F1+F2+F3+...+Fn) ?
    Et au fait, qu'entends-tu par "filtrer" ? Tu veux garder de FD les lignes se trouvant dans F1 ou les supprimer ?

    Citation Envoyé par CarreNoir Voir le message
    Ce qui veut dire que le fichier de sortie de ma boucle devient le .... fichier d'entrée au tour d'après !
    Et ça marche pas
    Pourtant ce n'est pas super compliqué...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    liste=(F[0-9]*)
    Fout="FD"
    for i in $(seq 0 $((${#liste[*]} - 1)))
    do
    	Fin="$Fout"
    	Fout="Res$(($i+1))"
    	echo "Je filtre $Fin sur ${liste[$i]} pour créer $Fout "
    done
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    à chacun sa solution. Je propose donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv FD bozo; cat F*|grep -v -x -f - bozo;mv bozo FD

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    Merci beaucoup à vous 3 de m'avoir aidé à débloquer la situation!!!!
    La solution la plus simple pour moi vu la taille de mes fichiers était celle de Sve@r.
    Bonne journée à tous !

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv FD bozo; cat F*|grep -v -x -f - bozo;mv bozo FD
    Pourquoi renommer FD ?
    Est-ce que ça n'irait pas aussi: cat F[0-9]*|grep -v -x -f - FD ???
    (non testé)

    Citation Envoyé par CarreNoir Voir le message
    La solution la plus simple pour moi vu la taille de mes fichiers était celle de Sve@r.
    Tu dois vraiment avoir des fichiers mega mega énormes pour que la solution de Flodelarab (au bozo près) ne puisse pas être apliquée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    C'est parfait.
    Je n'utilise jamais ces intervalles. Je me demandais s'il y avait confusion avec les regex.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    En fait la solution de Floderalab me sort pas ce que je veux.
    Je veux que ceux qui sont uniques dans FD. La ca me sort la "somme" de F1 ....Fn en supprimant ceux qui sont dans FD. Moi je veux garder tout ceux qui sont dans FD et que dans FD. Dès qu'une ligne de FD est trouvée dans F1 ou Fn , je veux la supprimer de FD....

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

Discussions similaires

  1. Sortie d'une boucle
    Par NELLLY dans le forum MATLAB
    Réponses: 11
    Dernier message: 14/01/2008, 19h36
  2. Réponses: 1
    Dernier message: 18/10/2007, 17h13
  3. [VBA-E] Ouvrir une série de fichiers à l'aide d'une boucle
    Par Tiki40 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/12/2006, 14h34
  4. vérification à la sortie d'une boucle
    Par freestyler dans le forum Delphi
    Réponses: 4
    Dernier message: 10/10/2006, 15h44
  5. [langage] condition de sortie d'une boucle
    Par perlaud dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2004, 10h25

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