Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/07/2022, à 13:54

MixT

recuperer un fichier contenu dans une liste

Hello tout le monde !


Sauriez-vous comment récupère un fichier un à un, contenu dans une liste, pour lui appliquer d'autres modification ultérieur ??

liste_fichier.txt

text1.txt
text2.txt
text3.txt

Merci !

Hors ligne

#2 Le 27/07/2022, à 14:05

Tawal

Re : recuperer un fichier contenu dans une liste

Hello,

Ça dépend de ce que tu entends par "récupérer".
Mais si c'est obtenir son nom dans une variable alors :

while read -r fichier
do
   commandes à appliquer sur le fichier "$fichier"
   par exemple :
   echo "$fichier"
   cat "$fichier"
done < liste_fichiers.txt

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#3 Le 27/07/2022, à 14:37

MixT

Re : recuperer un fichier contenu dans une liste

Les fichiers se trouvent dans une liste et j'aimerais récupérer les fichiers suivant la liste, je ne sais pas si c'est bien dit

Hors ligne

#4 Le 27/07/2022, à 14:39

MicP

Re : recuperer un fichier contenu dans une liste

Bonjour

MixT a écrit :

…appliquer des modifications aux fichiers …

Sans plus d'information concernant ces modifications,
je dirais qu'il te suffit d'utiliser la boucle while proposée par Tawal
en remplaçant la commande cat ou/et la commande echo par celle qui fera les modifications.

Dernière modification par MicP (Le 27/07/2022, à 14:40)

Hors ligne

#5 Le 27/07/2022, à 14:50

MixT

Re : recuperer un fichier contenu dans une liste

Comme un grep par exemple

liste_de_fichier.txt

texte1.txt
texte2.txt
texte3.txt

Je voudrais prendre le fichier texte1.txt puis  grep " jardin" et l'ajouter dans le fichier total.txt
Puis prendre le fichier texte2.txt puis  grep " jardin"  et l'ajouter dans le fichier total.txt  ( par un cat >> )
Puis prendre le fichier texte3.txt puis  grep " jardin"  et l'ajouter dans le fichier total.txt  ( par un cat >> )

Comme ça le fichier total.txt contient plusieurs lignes jardin suivant l'orde liste_de_fichiers.txt

Dernière modification par MixT (Le 27/07/2022, à 14:51)

Hors ligne

#6 Le 27/07/2022, à 14:52

Watael

Re : recuperer un fichier contenu dans une liste

pourquoi les noms sont-ils lister dans un fichier ?

on peut imaginer travailler avec xargs et sed...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 27/07/2022, à 14:58

MixT

Re : recuperer un fichier contenu dans une liste

Il fait que je grep les lignes dans l'ordre dans lequel elles sont dans liste_de_fichiers

for i in liste_de_fichier.txt  ; do
   grep 'jardin' b | cat b >> total.txt
done

Mais cela ne marche pas sad

Dernière modification par MixT (Le 27/07/2022, à 15:03)

Hors ligne

#8 Le 27/07/2022, à 18:29

Tawal

Re : recuperer un fichier contenu dans une liste

Heuu ...

Tout simplement :

grep -h jardin $(<liste_fichier.txt) > total.txt

Edit: Illustration

$ cat list.txt 
./1-fich
./3-fich
./2-fich
$
$ cat 1-fich
1-jardin
$
$ cat 2-fich
2-jardin
$
$ cat 3-fich
3-jardin
$
$ grep -h jardin $(<list.txt) > total.txt
$
$ cat total.txt
1-jardin
3-jardin
2-jardin
$

Edit2 :
Mais attention, si un nom de fichier dans la liste contient un espace, ça va rater !

Dernière modification par Tawal (Le 27/07/2022, à 18:49)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 Le 28/07/2022, à 11:52

MixT

Re : recuperer un fichier contenu dans une liste

Merci beaucoup de ton aide, mais le problème c'est que dans total.txt, jardin doit être listé dans le même ordre que dans liste_de_texte.txt

Dans le repertoire, j'ai texte1 texte2 texte3, or ils ont été créer à des  dates différentes, donc pour etre sur qu'ils soient concaténé suivant un ls -v je fait

ls -v  texte* > liste_of_texte.txt 

J’obtiens

texte1.txt
texte2.txt
texte3.txt

Ensuite, les fichiers texte contiennent la ligne jardin. Je voudrais les grep et les ajouter dans total.txt suivant l'ordre dans liste-of-texte.txt

jardin # issue de texte1.txt
jardin # issue de texte2.txt
jardin # issue de texte3.txt 

Je dois faire une boucle de type

 liste="liste-of-texte.txt"
for i in "$liste"; do  # le texte1 et lu, puis le texte2, puis le texte3 
	echo "$i"
	cat $i >> total.txt
done

Hors ligne

#10 Le 28/07/2022, à 12:44

Watael

Re : recuperer un fichier contenu dans une liste

pourquoi n'as-tu pas testé la première solution proposée par Tawal ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 28/07/2022, à 13:27

MixT

Re : recuperer un fichier contenu dans une liste

Je vais le faire.....

Hors ligne

#12 Le 28/07/2022, à 13:49

Tawal

Re : recuperer un fichier contenu dans une liste

La solution par grep respecte l'ordre de la liste de fichier.
Regarde mon illustration, la liste des fichiers est 1-fich suivi de 3-fich suivi de 2-fich.
L'ordre des lignes dans total.txt est bien 1-jardin, 3-jardin et 2-jardin.

Dernière modification par Tawal (Le 28/07/2022, à 13:51)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#13 Le 28/07/2022, à 14:01

MicP

Re : recuperer un fichier contenu dans une liste

Bonjour

1/ Préparation du contexte de test :

Je créé 3 fichiers nommés texte1.txt texte2.txt et texte3.txt
contenant plusieurs lignes dont une de ces lignes contient le mot jardin :

michel@deb114x:~/aeff$ i=100; for f in texte{1..3}.txt; do ((i--)); echo -e "\nContenu du fichier \"$f\" :\n\nbla bla\nun jardin numéro $i venant du fichier \"$f\"\nbli bli\n" >$f; done
michel@deb114x:~/aeff$ 

=======
2/ Vérification du contexte :
J'affiche le contenu de chacun de ces 3 fichiers :

michel@deb114x:~/aeff$ cat texte1.txt 

Contenu du fichier "texte1.txt" :

bla bla
un jardin numéro 99 venant du fichier "texte1.txt"
bli bli

michel@deb114x:~/aeff$ 
michel@deb114x:~/aeff$ cat texte2.txt 

Contenu du fichier "texte2.txt" :

bla bla
un jardin numéro 98 venant du fichier "texte2.txt"
bli bli

michel@deb114x:~/aeff$
michel@deb114x:~/aeff$ cat texte3.txt 

Contenu du fichier "texte3.txt" :

bla bla
un jardin numéro 97 venant du fichier "texte3.txt"
bli bli

michel@deb114x:~/aeff$ 

============================
============================

3/ La ligne de commande pour l'extraction :

Maintenant, j'extrais de chacun de ces fichiers (dans l'ordre correspondant au chiffre qui est dans leur nom)
la ligne qui contient le mot jardin

michel@deb114x:~/aeff$ sed -n '/jardin/p' texte{1..3}.txt 
un jardin numéro 99 venant du fichier "texte1.txt"
un jardin numéro 98 venant du fichier "texte2.txt"
un jardin numéro 97 venant du fichier "texte3.txt"
michel@deb114x:~/aeff$ 

=======
4/ en option :

Et bien sûr, je peux renverser l'ordre des fichiers :

michel@deb114x:~/aeff$ sed -n '/jardin/p' texte{3..1}.txt 
un jardin numéro 97 venant du fichier "texte3.txt"
un jardin numéro 98 venant du fichier "texte2.txt"
un jardin numéro 99 venant du fichier "texte1.txt"
michel@deb114x:~/aeff$ 

=======
Et s'il s'agit d'utiliser un tableau (array) contenant une liste de noms de fichier quelconques déjà ordonnée selon vos choix
on pourra tout aussi bien donner ce tableau en paramètre à la ligne de commande sed

michel@deb114x:~/aeff$ listeDesNoms=( texte2.txt texte1.txt texte3.txt )
michel@deb114x:~/aeff$ 
michel@deb114x:~/aeff$ sed -n '/jardin/p' ${listeDesNoms[@]}
un jardin numéro 98 venant du fichier "texte2.txt"
un jardin numéro 99 venant du fichier "texte1.txt"
un jardin numéro 97 venant du fichier "texte3.txt"
michel@deb114x:~/aeff$ 

Dernière modification par MicP (Le 28/07/2022, à 14:21)

Hors ligne

#14 Le 28/07/2022, à 14:20

MixT

Re : recuperer un fichier contenu dans une liste

Pour ce code
Je ne suis pas très à l'aise avec la boucle while mais bon,

while read -r fichier # j'obtiens le message `texte2.txt': not a valid identifier

do
   commandes à appliquer sur le fichier "$fichier"
   par exemple :
   echo "$fichier"
   cat "$fichier"
done < liste_fichiers.txt # Est-ce que  liste_fichiers.txt dois déja exister ? 

Le résultat de cette boucle est renvoyé où ?

Dernière modification par MixT (Le 28/07/2022, à 14:24)

Hors ligne

#15 Le 28/07/2022, à 14:28

MicP

Re : recuperer un fichier contenu dans une liste

Si :

Dans son message #1, MixT a écrit :


liste_fichier.txt

text1.txt
text2.txt
text3.txt

alors :

sed -n '/jardin/p' $(<liste_fichier.txt)

=====
Mais si :

Dans son message #5, MixT a écrit :



liste_de_fichier.txt

texte1.txt
texte2.txt
texte3.txt


alors :

sed -n '/jardin/p' $(<liste_de_fichier.txt)

=======
Mais si :

Dans son message #9, MixT a écrit :



Dans le repertoire, j'ai texte1 texte2 texte3, or ils ont été créer à des  dates différentes, donc pour etre sur qu'ils soient concaténé suivant un ls -v je fait

ls -v  texte* > liste_of_texte.txt 

J’obtiens

texte1.txt
texte2.txt
texte3.txt


alors :

sed -n '/jardin/p' $(<liste_of_texte.txt)
Dans son message #14, MixT a écrit :

… Le résultat de cette boucle est renvoyé où ? …

Si la ligne de commande(s) a été lancée dans une fenêtre de terminal,
le retour de commande sera affiché dans la fenêtre de terminal dans laquelle la ligne de commande aura été lancée,

… et si tu veux renvoyer le retour de la commande dans un fichier nommé : fichierRetourDeLaCommande.txt

sed -n '/jardin/p' $(<liste_of_texte.txt) > fichierRetourDeLaCommande.txt 

=======
Mais si le nom du fichier contenant la liste des fichiers est : liste_fichiers.txt
alors :

sed -n '/jardin/p' $(<liste_fichiers.txt) > fichierRetourDeLaCommande.txt 

Dernière modification par MicP (Le 28/07/2022, à 15:20)

Hors ligne

#16 Le 28/07/2022, à 16:43

Watael

Re : recuperer un fichier contenu dans une liste

quel est le gain de sed par rapport à grep ?

MixT a écrit :

# Est-ce que  liste_fichiers.txt dois déja exister ?

l'emploi d'un fichier temporaire est très facultatif :

while read var
do
    echo "$var"
done < <(ls -v text*)

Le résultat de cette boucle est renvoyé où ?

mais pourquoi ne testes-tu pas les codes qu'on te propose ?
qu'observes-tu ?

Dernière modification par Watael (Le 28/07/2022, à 16:54)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 28/07/2022, à 17:43

MicP

Re : recuperer un fichier contenu dans une liste

Watael a écrit :

quel est le gain de sed par rapport à grep ? …

Aucun (enfin, je pense…),  mais comme grep avait déjà été proposé par Tawal dans son message #8
alors j'ai proposé autre chose en espérant que ça convienne à MixT.

Dernière modification par MicP (Le 28/07/2022, à 17:44)

Hors ligne

#18 Le 28/07/2022, à 18:34

MixT

Re : recuperer un fichier contenu dans une liste

Merci beaucoup !

J'ai testé la boucle while, mais le resultat s'affiche dans le prompt et pas possible dans un fichier exterieur

Dernière modification par MixT (Le 28/07/2022, à 18:34)

Hors ligne

#19 Le 28/07/2022, à 18:41

Watael

Re : recuperer un fichier contenu dans une liste

il faut rediriger la sortie de la boucle, comme l'ont montré Tawal et MicP.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 28/07/2022, à 18:48

Tawal

Re : recuperer un fichier contenu dans une liste

Oups, mauvaise manip.
Et message supprimé.
Désolé sad

En gros tu peux rediriger la sortie de la boucle while :

while read -r fichier
do
   commandes à appliquer sur le fichier "$fichier"
done < fichier_liste > fichier_de_sortie

Dernière modification par Tawal (Le 28/07/2022, à 18:49)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne