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/01/2019, à 16:04

L'Africain

[Résolu] Scripter fusion de fichiers numérotés avec cat

Bonjour,
J'ai plusieurs fichiers qui contiennent chaque chapitre d'un même document.
Par exemple monlivre1.txt monlivre2.txt... Qui correspondent au chap 1 puis au chap 2 du fichier monlivre.
Mon problème c'est que lors de la fusion avec cat il me mets dans le fichier de sortie le chapitre dix avant le chapitre 1, il fusionne en binaire au lieu de respecter l'ordre numérique.
Je cherche à renommer mes fichiers pour qu'il me mettent 000 devant chaque chiffre et qu'ainsi la fusion soit correcte. Puis je voudrais scripter la fusion pour que tous les fichiers qui ont le même nom suivi d'un chiffre donne un fichier de sortie correspondant à chaque livre.
Ex: livreA1.txt livreA2.txt livreA10.txt en sortie LivreA.txt et livreB1.txt livreB2.txt livreB10.txt en sortie LivreB.txt.
Merci d'avance

Dernière modification par L'Africain (Le 29/01/2019, à 10:40)


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

Hors ligne

#2 Le 28/01/2019, à 16:30

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

salut,
je ne fais pas trop de bash en ce moment mais la version simple que je vois serait basée la dessus :

> "livreA.txt"
for un_livre in monlivre?.txt
do
    echo $un_livre
done

for un_livre in monlivre??.txt
do
    echo $un_livre
done

ensuite tu fais de la lecture de chaque fichier avec une fonction avec un cat qui remplacera

echo $un_livre

comme

cat $un_livre >> livreA.txt

... un truc comme ça quoi :

> "livreA.txt"
for un_livre in monlivre?.txt
do
    echo $un_livre
    cat "$un_livre" >> "livreA.txt"
done

for un_livre in monlivre??.txt
do
    echo $un_livre
    cat "$un_livre" >> "livreA.txt"
done

et tu peux renommer dans la foulée sur le même principe

Hors ligne

#3 Le 28/01/2019, à 16:36

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Merci Kholo pour ton aide, mais j'ai pas compris sad


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

Hors ligne

#4 Le 28/01/2019, à 17:19

pingouinux

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Bonjour,
Tu peux déjà essayer ceci pour renommer les fichiers, avec des nombres à 5 chiffres :

for i in *.txt
do
   n1=$(sed -r 's/[A-Za-z]+([0-9]+).txt/\1/' <<<"$i")
   printf -v n2 "%05d" "$n1"
   rename -n "s/$n1/$n2/" "$i"
done

Ces commandes ne modifient rien, et t'indiquent comment les fichiers seront renommés.
Si c'est bon, tu enlèves le paramètre -n de rename, et tu relances le script. Cela modifiera réellement les noms.

Hors ligne

#5 Le 28/01/2019, à 17:40

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Ok ça marche merci! Une seule erreur que je ne comprends pas. Certains fichiers commence par un chiffre et un tiret bas. j'ai alors modifier la ligne sed comme ceci:

n1=$(sed -r 's/.*[A-Za-z]+([0-9]+).txt/\1/' <<<"$i")

mais alors c'est bizarre c'est le premier chiffre qui prend les zéros et uniquement pour le fichier du chapitre 1, ex: 1_LivreA1.txt devient
00001_LivreA1.txt, mais 1_LivreA2.txt devient bien 1_LivreA00002.txt idem quand le livre commence par 2 mais pour le chapitre 2 (ça s'arrête à deux d'ailleurs).
Donc pour la première partie, ça fonctionne. Maintenant est-ce possible de scripter pour une fusion automatique des fichiers qui ont le même nom?


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

Hors ligne

#6 Le 28/01/2019, à 17:42

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

désolé, je te voyais plus connaisseur...
comme ce sont des fichiers texte, fais une copie de tout ou partie de ces fichiers dans un dossier...
dans ce nouveau dossier tu vas pouvoir buriner tes fichiers sans danger cool

tu ouvres le terminal dans ce dossier avec un clic droit dans un endroit blanc puis "ouvrir un terminal"
tu crées un fichier de script et tu le rends exécutable
triple clic sur chaque ligne, puis copier ; puis dans le terminal clic droit coller roll

> "un_script.sh"
chmod +x "un_script.sh"

puis tu édites avec

gedit "un_script.sh"

d'abord tu mets un shebang

#!/bin/bash

un saut de ligne...
à la suite de quoi tu vas pouvoir coller les propositions qu'elles viennent de moi ou d'autres comme pingouinux
ensuite, tu enregistres, tu fermes gedit et tu lances avec

./un_script.sh

ma proposition est de reprendre chaque fichier et de faire un cat qui va en lire le contenu et le "coller" dans un fichier :
NB tu peux laisser les lignes avec les # cool

> "livreA.txt" # je crée le fichier ; le > est pour créer un fichier vide
# je lit chaque fichier avec un seul numéro à la fin
for un_livre in monlivre?.txt
do
    echo $un_livre # cette ligne c'est juste pour voir l'avancement

    # là c'est la "copie" de l'intérieur du fichier lu vers le principal qui contiendra tout
    cat "$un_livre" >> "livreA.txt" 
done

# puis ceux avec 2 numéros : donc 2 ??
for un_livre in monlivre??.txt
do
    echo $un_livre
    cat "$un_livre" >> "livreA.txt"
done

# et tu peux suivre ce principe si tu as des fichiers par centaines voire par milliers... ??? puis ????...

Dernière modification par kholo (Le 28/01/2019, à 17:43)

Hors ligne

#7 Le 28/01/2019, à 17:49

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Salut kholo,
Je n'ai que des notions très élémentaires de bash, de sed. Ce n'est pas la manière de créer le script que je n'ai pas compris (ça je sais faire smile ), se sont les commandes elles-mêmes. J'avais déjà essayé de mettre tout ça dans un fichier. Par contre avec les commentaires j'y vois déjà un peu plus clair.
Mais ce que je comprends pas c'est que

$un_livre in monlivre?.txt

dois contenir le nom précis du fichier or c'est précisement mon problème car il y a plusieurs titres de livre. (Mais peut-être que quelque chose m'a échappé smile)


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

Hors ligne

#8 Le 28/01/2019, à 17:57

pingouinux

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

L'Africain #5 a écrit :

mais alors c'est bizarre c'est le premier chiffre qui prend les zéros et uniquement pour le fichier du chapitre 1, ex: 1_LivreA1.txt devient
00001_LivreA1.txt, mais 1_LivreA2.txt devient bien 1_LivreA00002.txt idem quand le livre commence par 2 mais pour le chapitre 2 (ça s'arrête à deux d'ailleurs).

Script modifié pour tenir compte de tes nouveaux noms de fichiers.

for i in *.txt
do
   n1=$(sed -r 's/.*[_A-Za-z]+([0-9]+).txt/\1/' <<<"$i")
   printf -v n2 "%05d" "$n1"
   rename -n "s/$n1\./$n2./" "$i"
done

Hors ligne

#9 Le 28/01/2019, à 18:02

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

sid tu fais un

ls monlivre?.txt

puis

ls monlivre??.txt

tu comprendras mieux alors

Hors ligne

#10 Le 28/01/2019, à 18:03

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

@pingouinux, ok super ça marche.


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

Hors ligne

#11 Le 28/01/2019, à 18:05

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

@kholo:

ls: impossibile accedere a 'monlivre?.txt': File o directory non esistente

J'ai évidemment remplacer monlivre par le nom du livre smile


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

Hors ligne

#12 Le 28/01/2019, à 18:08

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

si tes fichiers sont
monlivreX.txt
pour les avoir

ls monlivre?.txt

? pour tous les caractères 1 par 1
donc

ls monlivre??.txt

...

Dernière modification par kholo (Le 28/01/2019, à 18:09)

Hors ligne

#13 Le 28/01/2019, à 18:11

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

et mets des quottes si tu as des espaces

ls "mon livre"?".txt"

Hors ligne

#14 Le 28/01/2019, à 18:16

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Ah ok j'ai capté!! l'erreur était au nombre de caractères, ? par nombre de caractères oui je vois. Mais comment faire pour une variable avec plusieurs nom de livre. Parce que pour un cat avec les fichiers qui ont le même nom c'est facile, je l'avais déjà fait avec :

cat monlivre* >monlivre_sortie.txt

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

Hors ligne

#15 Le 28/01/2019, à 18:41

kholo

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

je me suis fais une liste de fichiers pour faire mes tests :
ls -1 pour avoir juste les noms de fichiers
et tu vois mon sh (le script)

ls -1
livreB1.txt
livreB2.txt
livreB3.txt
monlivre10.txt
monlivre11.txt
monlivre1.txt
monlivre2.txt
monlivre3.txt
monlivre4.txt
monlivre5.txt
monlivre6.txt
monlivre7.txt
monlivre8.txt
monlivre9.txt
regrouper.sh
un livre avec des espaces1.txt
un livre avec des espaces2.txt

voilà mon code

#!/bin/bash

# la liste des livres sans numéro et 1 par ligne
livres="monlivre
livreB
un livre avec des espaces"

# je transforme en liste
IFS=$'\n' livres=$livres

# ETAPE 1 ; je crée les receveurs
for un_livre in ${livres[@]}
do
    echo $un_livre
    # > $un_livre.txt # je crée le livre receveur
done

# ETAPE 2 : j'y met les livres avec un seul chiffre
for un_livre in ${livres[@]}
do
    # echo $un_livre
    for lebouquin in $un_livre?.txt
    do
        echo "$lebouquin"
        # cat "$lebouquin" >> "$un_livre.txt"
    done
done

# ETAPE 3 : j'y met les livres avec un 2 chiffres
for un_livre in ${livres[@]}
do
    # echo $un_livre
    for lebouquin in $un_livre??.txt
    do
        echo "$lebouquin"
        # cat "$lebouquin" >> "$un_livre.txt"
    done
done

# ETAPE 4 : j'y met les livres avec un 3 chiffres
for un_livre in ${livres[@]}
do
    # echo $un_livre
    for lebouquin in $un_livre???.txt
    do
        echo "$lebouquin"
        # cat "$lebouquin" >> "$un_livre.txt"
    done
done
# ...

si tu as bien la liste de tous les livres, tu peux retirer le # devant les cat
ET celui devant

# > $un_livre.txt # je crée le livre receveur

Hors ligne

#16 Le 28/01/2019, à 18:48

pingouinux

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Voici une suggestion pour regrouper les chapitres (si j'ai bien compris).

liste_noms=/tmp/liste_noms
dest=/tmp

>$liste_noms
for i in *.txt
do
   sed -r 's/[0-9]+\.txt//' <<<"$i" >>$liste_noms
done

while read fic
do
   cat "$fic"* >"$dest/$fic.txt"
done < <(sort -u $liste_noms)

Ce script est à lancer après avoir modifié les numéros. Les fichiers sont créés dans le répertoire $dest (/tmp dans le script).

Édité : Simplification

Dernière modification par pingouinux (Le 28/01/2019, à 18:56)

Hors ligne

#17 Le 29/01/2019, à 10:39

L'Africain

Re : [Résolu] Scripter fusion de fichiers numérotés avec cat

Merci à vous deux, ça fonctionne très bien.


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

Hors ligne