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 28/07/2020, à 12:50

L'Africain

[Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Bonjour,
Je voudrais fusionner des fichiers qui commencent par un nom identique suivi d'un chiffre. Il y a plusieurs fichiers avec des noms différents.
Exemple. J'ai 50 fichiers qui s'appellent gen00x.txt (où le x est un chiffre différent pour les 50), puis 28 autres  par exemple mat00x.txt.
Je voudrais donc un fichier gen.txt qui rassemble tous les gen00x.txt et un autre mat.txt qui rassemble tous les mat00x.txt. Certains on aussi un chiffre dans leur nom comme jo1 ou kg2, mais ils sont toujours suivis par 3 chiffres.
Je sais le faire avec cat avec un fichier, mais je sais pas comment écrire ma boucle pour qu'il tienne compte des noms présents dans les fichiers.

Merci pour votre aide.

Dernière modification par L'Africain (Le 29/07/2020, à 13:16)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 28/07/2020, à 14:02

MicP

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Bonjour

Ce n'est pas très clair :

…qu'il tienne compte des noms présents dans les fichiers. …

Est-ce qu'il s'agit de quelque chose qui est contenu dans le texte du fichier ?
Ou bien, est-ce qu'il s'agit du nom du fichier ?
Si c'est dans le contenu du fichier, il faudra nous donner un extrait de ce contenu et nous dire ce que tu compte en faire.

=======
Donne la liste de ces fichiers "gen00x.txt" et "mat00x.txt"
et dis nous s'ils doivent êtres concaténés dans un certain ordre
ou alors, si l'ordre de concaténation n'a pas d'importance.

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

Hors ligne

#3 Le 28/07/2020, à 14:39

L'Africain

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Ou bien, est-ce qu'il s'agit du nom du fichier ?

Oui c'est le nom du fichier (mais au final c'est pas très important pour moi la sortie pourrait même être out1.txt.. Je m'en contenterai.). Dans mon exemple les fichiers de sortie seraient, gen.txt et mat.txt

Dernière modification par L'Africain (Le 28/07/2020, à 14:40)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 28/07/2020, à 14:41

kamaris

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Basiquement c'est

cat gen*.txt >gen.txt

Regarde si ça te convient : si non, c'est que MicP a vu juste et que c'est plus compliqué, auquel cas il faut effectivement préciser…

Hors ligne

#5 Le 29/07/2020, à 09:34

L'Africain

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Merci Kamaris, en effet basiquement c'est ça. Cependant ce que je souhaite c'est faire une boucle car j'ai de nombreux fichiers à fusionner avec des noms différents, mais c'est la boucle que je ne sais pas faire.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#6 Le 29/07/2020, à 09:45

Sciensous

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

du genre:

touch gen.txt; for f in gen*.txt;do echo "Fichier $f"|tee -a "$f"; cat "$f">>gen.txt;done

Dernière modification par Sciensous (Le 29/07/2020, à 09:45)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#7 Le 29/07/2020, à 09:50

L'Africain

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Merci Sciensous, mais c'est gen qui devrait être une variable, car c'est le nom du fichier qui est différent. Pour expliquer encore un peu plus si je fais ta boucle je devrais le faire 250 fois car j'ai 250 fichiers avec des noms différents.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#8 Le 29/07/2020, à 10:17

kamaris

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Ok, je pense que je comprends un peu mieux.
Il me semble qu'il faudrait procéder en deux temps :

  1. identifier les préfixes de noms de fichiers présents dans le répertoire (gen, mat, jo1, kg2, …) : pour cela, il faut bien se mettre d'accord sur le critère permettant d'isoler ces préfixes ;

  2. concaténer les fichiers pour chaque préfixe.

Pour le premier point, au vu de ce que tu as dit jusque-là, je dirais que le critère pour isoler les préfixes est que les noms de fichiers se terminent toujours par ce motif regex : [0-9]{3}.txt
Donc, je propose de stocker tout d'abord ces préfixes dans un tableau par la commande suivante :

mapfile -td '' a < <(find . -type f -name '*[0-9][0-9][0-9].txt' -printf '%f\0' | awk 'BEGIN{RS="\0"} {sub("[0-9]{3}.txt$","")} !a[$0]{a[$0]=1; printf("%s\0",$0)}')

Cette commande est à exécuter dans le répertoire où se trouvent les fichiers, ou alors il faut modifier le répertoire de base pour find.

Ensuite, il suffit de boucler sur les éléments du tableau pour les concaténations :

for p in "${a[@]}"; do cat "$p"[0-9][0-9][0-9].txt >"$p.txt"; done

De même, cette commande est à exécuter dans le répertoire où se trouvent les fichiers, ou alors il faut modifier un peu pour généraliser.

Dernière modification par kamaris (Le 29/07/2020, à 10:18)

Hors ligne

#9 Le 29/07/2020, à 10:37

kedjo

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Bonjour.
Tu peux créer un fichier .sh

touch ../gen.txt
for x in ./*;
do
        cat $x >> ../gen.txt
done
exit

./* : le répertoire des fichiers
../gen.txt: Fichier de réception

Hors ligne

#10 Le 29/07/2020, à 11:15

kamaris

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Désolé, mais tout ce que tu ajoutes ici est inutile :
- le fichier .sh
- l'appel de touch
- la boucle avec les multiples appels de cathmm
(indépendamment même du fait qu'il est maintenant clair que ça ne répond pas au problème)

Dernière modification par kamaris (Le 29/07/2020, à 11:18)

Hors ligne

#11 Le 29/07/2020, à 12:56

kedjo

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Désolé Kamaris,
Je n'avais pas bien cerné le problème.
Mais j'ai garde toujours mon fichier .sh
Je propose aussi ce qui suit. Merci Kamaris de recadrer

for x in ./*
do
        cat $x  >>  $(echo .$x | sed -e "s/[0-9][0-9][0-9]//g")
done
exit

Les fichiers recepions seront stockés dans le répertoire parent

Hors ligne

#12 Le 29/07/2020, à 13:16

L'Africain

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Merci à vous deux pour votre aide, Kamaris cela fonctionne. J'ai testé sur 2 fichiers. A priori c'est donc bon.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#13 Le 29/07/2020, à 15:33

kamaris

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

@kedjo : c'est vraiment dommage (le mot est faible) de boucler sur tous les fichiers en appelant cat une fois par fichier, alors que le principe même de cat est de concaténer plusieurs fichiers en un seul.
Il faut réduire au maximum les appels de cat (et donc aussi les accès disque), d'où le prétraitement pour identifier les préfixes, en les stockant dans un tableau à partir duquel ils pourront être réutilisés proprement.

Par ailleurs :
- bash permet de faire des développements de variable avancés sans faire appel à sed (mais ici il suffit de recourir à un développement posix) ;
- la substitution que tu fais par sed n'est pas assez précise (exemple : que se passe-t-il pour 123fichier456.txt ?) ;
- il faut protéger les développements de variable par des guillemets doubles :

cat "$x" >> ".${x%[0-9][0-9][0-9].txt}.txt"

Dernière modification par kamaris (Le 29/07/2020, à 15:36)

Hors ligne

#14 Le 29/07/2020, à 15:47

xubu1957

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

[HS]

Bonjour,

@L'Africain

Pour cette discussion > imprimante laser Ricoh SP 211 n'imprime pas, des conseils par rapport à ton PPA ?

Merci d'avance. smile

[/HS]


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

En ligne

#15 Le 29/07/2020, à 16:00

MicP

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Bonjour

En supposant qu'il n'y a pas de caractère espace dans les noms des fichiers,
j'avais pensé à cette simple boucle for
qui n'utilisera qu'une seule commande cat pour chacun des différents préfixes :

for f in *[0-9][0-9][0-9].txt; do prefixe=${f/[0-9][0-9][0-9].txt/}; [ -f $prefixe.txt ] || cat $prefixe[0-9][0-9][0-9].txt > $prefixe.txt; done

Dernière modification par MicP (Le 29/07/2020, à 16:01)

Hors ligne

#16 Le 29/07/2020, à 16:18

kamaris

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Oui voilà, en shell on peut faire ça, mais je pense que pour suffisamment de fichiers, le prétraitement en bloc par find | … doit être plus rapide.
Mais pourquoi supposer que les noms de fichiers ne contiennent pas d'espaces (ni de caractères spéciaux) ?
Par ailleurs le prefixe=${f/[0-9][0-9][0-9].txt/} est un peu imprécis tongue

Hors ligne

#17 Le 29/07/2020, à 17:51

kedjo

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

Ok @kamaris, merci

Hors ligne

#18 Le 29/07/2020, à 18:45

MicP

Re : [Résolu] Boucle pour fusionner plusieurs fichiers de même noms

…Mais pourquoi supposer que les noms de fichiers ne contiennent pas d'espaces (ni de caractères spéciaux) ? …

J'avais demandé la liste des fichiers dans mon message #2 mais j'ai dû me contenter des informations données dans le messages #1 de L'Africain

Dernière modification par MicP (Le 29/07/2020, à 18:46)

Hors ligne