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 20/12/2017, à 20:14

L'Africain

[ Résolu ] Fusionner fichier de note dans autre fichier texte

Bonjour à tous,
Alors je sais pas si ce que je vais demander est la lune, mais bon on ne sait jamais, vous m'avez déjà tellement dépanné!
Alors voilà le problème. J'ai un fichier disons 00_fichier.txt et un autre 00_fichier_notes.txt.
Je veux fusionner automatiquement le deuxième (les notes) dans le premier.
Ce qui est bien c'est que dans le premier fichier il y a un astérisque à chaque endroit qui doit avoir une note, et des balises qui permettent d'identifier le "lieu" et dans le fichier des notes il a une référence avec la bonne balise.
Voici un exemple, premier fichier:

\c 1
\s Nzambe, Mozalisi walikolo nanse
\p
\v 1 O libandela Nzambe akeli likolo na nse.
\v 2 Nse ezalaka se mpa­mba, eloko yoko ezalaka wana te. Molili mozalaka bipai binso mpe mpema ya Nzambe ezalaka ko­leka likolo lya mai lokola mo­mpepe.
\v 3 Nzambe alobi: «Mwinda mozala», mpe mwinda mobimi.
\v 4 Nza­mbe amoni ’te mwinda mozalaki malamu mpe akaboli mwinda na molili.
\v 5 Nzambe apesi mwinda nko­mbo moi, apesi molili nkombo butu. Mpokwa eyi­ndi, ntongo etani: ezalaki mokolo mwa yambo *.
\v 6 Nzambe alobi: «Etando ezala, ekabola mai mazali o likolo na mai mazali o nse»; esalemi se bongo.
\v 7 Nzam­be akeli etando * ekaboli mai mazali o nse ya etando na mai mazali likolo;

Les identifiants sont \c 1 et \v 5 puis \v 7.
Le second fichier:

1,5.    Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala.
1,7.    Ba-Israel, na bato banso ba eleko ena, bakanisaki ’te likolo lya mokili ezipeli enene ezalaki eye ekaboli nse eye na mai manene mazalaki o likolo.

Vous voyez que le début de la ligne commence par les identifiants 1,5 et 1,7.

Le fichier une fois la note intégrée dans avoir cette forme (ex pour le \v 5) :

\v 5 Nzambe apesi mwinda nko­mbo moi, apesi molili nkombo butu. Mpokwa eyi­ndi, ntongo etani: ezalaki mokolo mwa yambo\f + \fr 1,5 \ft Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala.\f*.

Je précise encore qu'il y a 80 fichiers, et qu'ils sont numérotés, et les numéros correspondent, c'est à dire que pour le fichier 00 c'est le fichier 00_notes.

Merci d'avance, j'espère ne pas avoir été trop brouillon pour l'explication.

Dernière modification par Ayral (Le 12/12/2019, à 16:11)


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

Hors ligne

#2 Le 21/12/2017, à 11:00

Arbiel

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Bonjour

Que signifient les lettres c, p ou v qui suivent \ ? Ont-elles une quelconque importance ?

L'Africain a écrit :

Vous voyez que le début de la ligne commence par les identifiants 1,5 et 1,7.

L'ensemble \(c, p ou v) jusqu'au \. suivant tient-il aussi sur une seule ligne ?
Pourquoi, dans le fichier des notes, les notes sont-elles précédées d'un numéro et d'une virgule, dans ton exemple "1," ?

Je commencerais par découper le fichier des notes en autant de petits fichiers que nécessaire dont le nom serait le repère de la note (1,5 ou 1,7), par exemple /tmp/notes/1,5 …

A la lecture du fichier principal, pour chaque *, je chercherais en début de ligne le repère de la note, et je remplacerais * par le contenu de la note.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#3 Le 21/12/2017, à 13:03

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Salut et déjà merci,
\c= chapitre
\p= paragraphe
\v= verset
C'est du code usfm

L'ensemble \(c, p ou v) jusqu'au \. suivant tient-il aussi sur une seule ligne ?

Oui en effet c'est sur une seule ligne.

Pourquoi, dans le fichier des notes, les notes sont-elles précédées d'un numéro et d'une virgule, dans ton exemple "1," ?

Le 1 correspond au \c 1, et le chiffre qui suit la virgule correspond au \v 5 du chapitre 1.

Je commencerais par découper le fichier des notes en autant de petits fichiers que nécessaire dont le nom serait le repère de la note (1,5 ou 1,7), par exemple /tmp/notes/1,5 …

A la lecture du fichier principal, pour chaque *, je chercherais en début de ligne le repère de la note, et je remplacerais * par le contenu de la note.

Ok mais comment on fait ça smile? Et après pour les fusionner?

Dernière modification par L'Africain (Le 21/12/2017, à 13:08)


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

Hors ligne

#4 Le 21/12/2017, à 15:56

LeoMajor

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

bonjour,

2 substitutions en 1,5 et 1,7 ??

~$ awk '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0; print "--debug-A",tmp,$0 }; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"***\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0); print "--debug-B",$0}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt 

--debug-A 1,5.  Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala.
--debug-A 1,7.  Ba-Israel, na bato banso ba eleko ena, bakanisaki ’te likolo lya mokili ezipeli enene ezalaki eye ekaboli nse eye na mai manene mazalaki o likolo.
--debug-B \v 5 Nzambe apesi mwinda nko­mbo moi, apesi molili nkombo butu. Mpokwa eyi­ndi, ntongo etani: ezalaki mokolo mwa yambo ***\f + \fr 1,5 \ft  Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala. \f*.
--debug-B \v 7 Nzam­be akeli etando ***\f + \fr 1,7 \ft  Ba-Israel, na bato banso ba eleko ena, bakanisaki ’te likolo lya mokili ezipeli enene ezalaki eye ekaboli nse eye na mai manene mazalaki o likolo. \f* ekaboli mai mazali o nse ya etando na mai mazali likolo;

Dernière modification par LeoMajor (Le 21/12/2017, à 16:01)

Hors ligne

#5 Le 21/12/2017, à 16:11

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Bonjour LeoMajor,
Oui ça me semble déjà bien!! Mais comment intégrer ça à un fichier unique sans oublier le reste du contenu de 00_fichier.txt, car il y a des lignes sans notes qu'il ne faut pas perdre (Je suis un incompétent dans le domaine désolé smile)? Après il faut juste virer les 3 * (j'ai pas compris leur utilité?) .
Les lignes de debug-B dans le terminal sortent correctement.

Dernière modification par L'Africain (Le 21/12/2017, à 16:17)


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

Hors ligne

#6 Le 21/12/2017, à 16:35

LeoMajor

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

si tu veux tout afficher

awk  '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"***\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0)}; {print}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt 2>/dev/null

edit ou variante "tout afficher"

~$ awk  '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0; $1=tmp}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0)}; {print}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt 2>/dev/null

1,5. Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala.
1,7. Ba-Israel, na bato banso ba eleko ena, bakanisaki ’te likolo lya mokili ezipeli enene ezalaki eye ekaboli nse eye na mai manene mazalaki o likolo.
\c 1
\s Nzambe, Mozalisi walikolo nanse
\p
\v 1 O libandela Nzambe akeli likolo na nse.
\v 2 Nse ezalaka se mpa­mba, eloko yoko ezalaka wana te. Molili mozalaka bipai binso mpe mpema ya Nzambe ezalaka ko­leka likolo lya mai lokola mo­mpepe.
\v 3 Nzambe alobi: «Mwinda mozala», mpe mwinda mobimi.
\v 4 Nza­mbe amoni ’te mwinda mozalaki malamu mpe akaboli mwinda na molili.
\v 5 Nzambe apesi mwinda nko­mbo moi, apesi molili nkombo butu. Mpokwa eyi­ndi, ntongo etani: ezalaki mokolo mwa yambo \f + \fr 1,5 \ft  Moto akomi buku eye alingi kopesa ndimbola ya ebandela ya molóngó mobimba lokola bato ba mayele ba sikawa te. Buku eye ekomami na ntina ena te. Alingi bobele koyebisa ’te Nzambe akeli manso tokoki komono. Yango wana akaboli mango lokola azalaki komono ­ma­ngo o likolo, o mbu, o mokili, epai na epai. Alakisi bongo Nzambe lokola ­moto asali mikolo motoba, o mokolo moko moko mosala mosusu, mpo apema o mokolo mwa nsambo (Sabato), engebene na mobeko Nzambe apesaki ba-Israel. Kasi toyebi na bosolo ’te Nzambe akeli binso lokola mosali te, kasi se na ndinga ya ye: ekoki na Ye ’te akanisa byango mpo bizala. \f*.
\v 6 Nzambe alobi: «Etando ezala, ekabola mai mazali o likolo na mai mazali o nse»; esalemi se bongo.
\v 7 Nzam­be akeli etando \f + \fr 1,7 \ft  Ba-Israel, na bato banso ba eleko ena, bakanisaki ’te likolo lya mokili ezipeli enene ezalaki eye ekaboli nse eye na mai manene mazalaki o likolo. \f* ekaboli mai mazali o nse ya etando na mai mazali likolo;

et enregistrer
euh la même chose, mais avec inplace

awk -i inplace -v INPLACE_SUFFIX=.old '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"***\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0)}; {print}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt 2>/dev/null

ensuite intégrer dans une boucle
à adapter.

Dernière modification par LeoMajor (Le 21/12/2017, à 16:55)

Hors ligne

#7 Le 21/12/2017, à 19:52

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Waouh super ça fonctionne parfaitement! Pour la boucle j'ai simplement renommé l'extension des "00_fichier" en .usfm, et les notes j'ai laissé .txt. Finalement j'ai eu la lune!

Au fait on peut faire ça dans un autre dossier que dans le tmp?

Et enfin est-ce possible de coller le \f + au texte qui précède? Sinon je le refait après avec sed, mais bon si on peut le faire d'un coup...

Déjà merci beaucoup!

Edit: Euh je me suis réjouis un peu vite visiblement ma boucle c'est pas encore ça car j'ai pas le contenu de la note juste la référence, comme ça:

\f + \fr 1,11 \ft  \f*

entre \ft et \f* il n'y a rien sniff. Or si je le fais individuellement ça fonctionne.

Dernière modification par L'Africain (Le 21/12/2017, à 20:14)


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

Hors ligne

#8 Le 22/12/2017, à 08:55

DonutMan75

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Hello,
juste par curiosité, c'est écrit en quelle langue ?

Bonne journée à tous smile

Donut

Hors ligne

#9 Le 22/12/2017, à 09:18

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

C'est du lingala smile
@LeoMajor,
J'ai chercher un peu pour la boucle mais avec comme il y a deux variables je sais pas comment faire, un truc du genre:

for i=txt j=usfm; do

awk -i inplace -v INPLACE_SUFFIX=.old '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\ */,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0)}; {print}'  /tmp/$i  /tmp/$j 2>/dev/null

done;

Pour l'espace avec le * et les 3 *, ça j'ai capté comment modifier smile


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

Hors ligne

#10 Le 22/12/2017, à 14:43

LeoMajor

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

for item in {1..99}
do printf -v id "%02d" "$item"; echo "${id}_fichier.txt, ${id}_fichier_notes.txt"
awk  -i inplace -v INPLACE_SUFFIX=.old  '$1~/^[0-9]+\,[0-9]+\./ { tmp=$1; $1=""; refs[tmp]=$0; $1=tmp}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]" \\f\*",$0)}; {print}'  "${id}_fichier_notes.txt"  "${id}_fichier.txt"
done

Hors ligne

#11 Le 22/12/2017, à 17:32

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Merci Léo, on y presque, reste une petite variable, à savoir le mot "fichier" dans le nom du fichier est lui aussi variable. Donc le nom des fichiers est par ex 01_Genesis.txt et 01_Genesis_notes.txt, 03_Number.txt et 03_Number_notes.txt, etc.

Edit: Finalement j'ai renommé les fichiers en supprimant cette variable, donc c'est ok, j'ai simplement numéroté et laissé le mot "notes" pour les distinguer.

Je me suis aussi rendu compte qu'il y a certaines notes qui ont du contenu sur deux ou plusieurs lignes mais alors le retour à la ligne commence toujours par une tabulation et un tiret spécial comme ça:

12,3.    –Ebakata ya nyama ebe, nani wana? Tala 12,9.
    –‘Motane’: Langi la móto mpe la makila.
    –‘Maseke zomi’, elakisi nguya ya yango enene.
    –Tala Dan 7,7.ation et tiret spécial:

J'ai essayer de remplacer ça avec sed ou tr, mais j'y arrive pas! On peut le remplacer par le code \fp (paragraphe de note) et supprimer le \n éventuellement la \t.

Edit2:
J'ai découvert aussi une fois la fusion réalisée, qu'il y a quelques exceptions de notes qui se trouve dans le titre dont la ligne se présente ainsi:

\s Etumba o Yamnia esuki mabe *

ou (dans ce deuxième cas c'est toujours le titre qui précède le \v 1):

\cl Nzembo 146 (145): Nzambe, elikya ya bato ba mawa *

Dernière modification par L'Africain (Le 24/12/2017, à 12:05)


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

Hors ligne

#12 Le 25/12/2017, à 16:11

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Salut,
Juste pour info, j'ai finalement réussi à supprimer les retour chariot avec sed pour les remplacer par \fp

find . -name "*.txt" -exec sed -i ':a;N;$!ba;s/\n\t–/ \\fp –/g' {} \;

Il me reste donc plus qu'à intégrer les notes qui suivent un titre \s ou \cl.


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

Hors ligne

#13 Le 27/12/2017, à 17:09

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

J'ose un petit up si proche du but smile


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

Hors ligne

#14 Le 20/07/2019, à 08:18

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Bonjour,
Je reviens sur ce fils, car j'ai a nouveau besoin de ce script mais je ne comprends pas pourquoi dans le fichier de sortie, il ne met pas le contenu de la note seulement la référence. La note est légèrement différente, elle est comme cela:

2,3 Mon texte de ma note

J'ai adapter le script comme suit, mais je ne vois pas où est l'erreur:

#!/bin/bash
#Ce script permet de fusionner des notes numérotées avec le chapitre et le verset séparé par une virgule. Fichier notes **.txt, fichier bible *.usfm
for item in {0..81}

do printf -v id "%02d" "$item"; echo "${id}.usfm, ${id}.txt"
awk  -i inplace -v INPLACE_SUFFIX=.old  '$1~/^[0-9]+\,[0-9]+/{ tmp=$1; $1=""; refs[tmp]=$0; $1=tmp}; $1=="\\c" {rf=$2}; $1=="\\v" && /\*/ { sub(/\*/,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2"."]"\\f\*",$0)}; {print}'  "${id}.txt"  "${id}.usfm"
done

Pour rappelle ce script permet d'identifier dans le fichier source (usfm) les endroits où viennent les notes grâce à une étoile. La note est précéder de deux numéros qui permettent de savoir exactement où elles viennent dans le fichier source.
J'ai par contre une petite variable, à  savoir que quelque fois la note est dans le titre qui précède le numéro du verset.
Merci d'avance.


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

Hors ligne

#15 Le 02/12/2019, à 22:49

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Bonjour,
Je reviens vers vous car entretemps on m'a aidé avec un script qui fonctionne presque correctement. Le point problématique est le suivant: L'intégration de la note dans le fichier final, est suivit de la note suivante.
Par exemple si j'ai une note 1,5 et une note 1,6 alors il va me mettre ces deux notes au même endroit. Puis au 1,6 il va remettre la bonne note 1,6 suivi par celle qui suivra à nouveau la 1,6.
un exemple vaut mieux qu'une longue explication:

\v 5 Nsemo, Nzambi bingaka yo “mwini”. Mudidi, yandi bingaka yo “mpimpa”. Nkokila kubwa, ntangu kubasika, yina kilumbu ya ntete\f + \fr 1,5 \ft Muntu ya kusonikaka mukanda yai zolaka ve kutendula luyantiku ya nsi-ntoto mvimba ti mutindu bantu ya ngangu ya bubu yai ke tendula yo. Mukanda yai me sonama ve na kikuma yina. Yandi zola kaka kusonga nde Nzambi muntu ya me ganga bima yai yonso ya beto ke mona.
\fp Yo yina yandi kabisaka yo mutindu ya yandi vandaka kumona na zulu, na nzadi-mungwa, na ntoto, na bifulu yonso. Yandi ke tendula yo bonso nde Nzambi me sala yonso kaka na bilumbu sambanu, konso kilumbu kisalu mosi sambu yandi kupema na kilumbu ya nsambwadi (kisabato). Yo ke kwendila ti nsiku ya Nzambi kupesaka na bana ya Israel. Kansi beto zaba mbote nde Nzambi kugangaka ve bima yonso bonso muntu ya kisalu, kansi na ndinga na yandi kibeni: Yo kulunga kaka nde yandi yindula ye yo mpi ke salama buna. − Nsoniki (Mbuta-Nganga) ke sonika na kukembila Nzambi, sambu yandi gangaka bima yonso na ngindu ya mbote. Nsoniki ke ndima bangindu mingi ya bambuta ya ntangu yina, kansi yandi ke kotisa yo na kati ya masolo ya ke basika na ngindu na yandi ya kukembila Nzambi ya kieleka. Yo yina, kuyuvula nsoniki ve bangyuvula ya ke tadila bantu ya ngangu. Mu mbandu, kuyuvula ve nde: ‘Kilumbu mosi ya awa ke fwanana na bamvula kwa na meso ya bantu ya mayele?’ bonso nde bilumbu nsambwadi ya awa vandaka mpila mosi ba nsungi nsambwadi!
1,6 Lufumba ya zulu. Bambuta ya ntangu yina vandaka kuyindula nde: zulu ke fika ntoto bonso mpu ya ngolo-ngolo. Yo kele ya kufumbama bonso nkongolo. Nzambi me zika yo mbote-mbote na bansuka ya ntoto, bonso na makunzi zole: yo ke kwenda tuka nsuka mosi ya ntoto tii kuna nsuka yankaka. Na ngindu na bo, yo ke kanga masa na nima na yo. Ibuna ntangu Nzambi zola kunokisa mvula, yandi fwete kuzibula mabulu ya fioti ya yandi yidikaka na kati ya lufumba. Tanga mu mbandu Luy 7,11 ye Nke 77,23 ye Nke 103,3 ye Luk 4,25. − Na mambu ya ke tadila makunzi, tanga Nke 103,5 ye Nke 17,8.
 \f*.

Voici le script en question:

#!/bin/bash
#
## note2usfm.sh add notes to an usfm file
# - 2019 for crosswire.org gplv3


# commmand arguments:
#  --extract (-x) - Extract a note, need chapter+verse
#  --note-file=<file name> - location of usfm file
#  --usfm-file=<file name> - location of notes file
#  --chapter=<numeric value> - chapter number
#  --verse=<alphanumeric value> - verse number

unset EXTRACT

while [ $# -gt 0 ]; do
  case "$1" in
    --extract|-x)
	EXTRACT='yes'
      ;;
    --note-file=*)
	NOTEFILE="${1#*=}"
	;;
    -n=*)
	NOTEFILE="${1#*=}"
	;;
    --usfm-file=*)
	USFMFILE="${1#*=}"
	;;
    -u=*)
	USFMFILE="${1#*=}"
	;;
    --chapter=*)
	CHAPTER="${1#*=}"
	;;
    --verse=*)
	VERSE="${1#*=}"
      ;;

    *)
	printf "%s: Error: Invalid argument.\n" $1 > /dev/stderr
	printf "usage: %s --note-file=<notes> --usfm-file=<usfm>\n" "$0"  > /dev/stderr
	printf "   or: %s -n=<notes> -u=<usfm>\n" "$0"  > /dev/stderr
      exit 1
  esac
  shift
done


function error() {
    case "$1" in
	1)
	    printf "Error: %s: Invalid or missing value.\n" "$2" > /dev/stderr ;;
	2)
	    printf "Error: %s: File not found.\n" "$2" > /dev/stderr ;;
	3)
	    printf "Error: %s: File is not readable.\n" "$2" > /dev/stderr ;;
    esac
    exit 1
}

function warning() {
    case "$1" in
	1)
	    printf "Warning: %s is set but not used.\n" "$2" > /dev/stderr ;;
	2)
	    printf "Warning: %s: File not found. Skipping.\n" > /dev/stderr "$2"
	    exit 1 ;;
	3)
	    printf "Warning: %s: File is not readable. Skipping\n" > /dev/stderr "$2"
	    exit 1 ;;
    esac
}

function ipn2num() {
    # (temporary hack) convert Indo–Persian numerals to arabic
    # We take advantage of the fact that the UNICODE code point of Indo–Persian numerals
    # are consecutive and ordered from 0 to 9:

    numeral="$1"
    while (( ${#numeral} > 0 )); do
        # extract the last hex digit from the UNICODE code point
        # of the first character in the string "$numeral":
	printf '%d' $(( $(printf '%d' "'$numeral") & 0xF ))
	## Remove one character from $numeral
        numeral=${numeral#?}
    done
}

# usfm file checks
[ "$EXTRACT" ] || [ "$USFMFILE" ] ||  error 1 "--usfm-file"
[ -e $USFMFILE ] || error 2 "--usfm-file=$USFMFILE"
[ -r $USFMFILE ] || error 3 "--usfm-file=$USFMFILE"

# note file checks
[ "$NOTEFILE" ] || error 1 "--note-file"
[ -e $NOTEFILE ] || error 2 "--note-file=$NOTEFILE"
[ -r $NOTEFILE ] || error 3 "--note-file=$NOTEFILE"

# chapter validity checks
if [ "$CHAPTER" ]; then
    echo "$CHAPTER" | awk '/^[0-9|၀-၉]+$/{exit 0}{exit 1}' || error 1 "--chapter=$CHAPTER"
    NUMBER="$(ipn2num "$CHAPTER")"
    [ "$NUMBER" -lt "1" ] && error 1 "--chapter=$CHAPTER"
    [ "$NUMBER" -gt "155" ] && error 1 "--chapter=$CHAPTER"
fi

# verse validity checks
if [ "$VERSE" ]; then
    echo "$VERSE" | awk '/^[0-9|၀-၉]+[a-z|က-ၿ]?$/{exit 0}{exit 1}' || error 1 "--verse=$VERSE"
    VERSENUM="$(echo $VERSE | sed s'/[a-z]//g')"
    NUMBER="$(ipn2num "$VERSENUM")"
    [ "$NUMBER" -lt "1" ] && error 1 "--verse=$VERSE"
    [ "$NUMBER" -gt "179" ] && error 1 "--verse=$VERSE"
fi

# extract validity checks
[ "$EXTRACT" ] && [ ! "$CHAPTER" ] && error 1 "--chapter="
[ "$EXTRACT" ] && [ ! "$VERSE" ] && error 1 "--verse="

[ ! "$EXTRACT" ] && [ "$CHAPTER" ] && warning 1 "--chapter=$CHAPTER"
[ ! "$EXTRACT" ] && [ "$VERSE" ] && warning 1 "--verse=$VERSE"

# command validity checks
CMD=$0
[ -e $CMD ] || error 2 "$CMD"
[ -r $CMD ] || error 3 "$CMD"



function extract() {

TEMPFILE="$(mktemp -t note2ufsm-XXXXXXXX)"

awk -v chapter="$CHAPTER" -v verse="$VERSE" -v tempfile="$TEMPFILE" '

BEGIN {
    multiline  = 0
}

{
    if (multiline == 1) {
	# multiline mode is on
	if ( match($1, /[0-9|၀-၉]+\,[0-9|၀-၉]+/) )
	{
	    # reference found -> this is a new note
	    # set mutiline mode off
	    multiline = 0
	    # close current note (print end of line)
	    print
	}
	else
	    # no reference found -> new paragraph of the current note
	    # print footnote additional paragraph usfm marker
	    printf "\\fp %s", $0
    }

    # generate regexp using chapter and verse
    regexp = sprintf("^%s,%s$", chapter,verse)

    # search a note matching regexp
    if (match($1, regexp)) {
	# matching chapter + verse
	# set multiline mode on
        multiline = 1
	# print the whole note minus the leading reference (discarded)
	printf "%s", substr($0, length($1) + 2)
    }
    # Save not matching notes (temp file)
    if (multiline == 0)
	print $0 > tempfile

}' "$FAILFILE"

cp "$TEMPFILE" "$FAILFILE"

rm -f "$TEMPFILE"

}


function insert() {

cp "$NOTEFILE" "$FAILFILE"

awk -v cmd="$CMD" -v notefile="$NOTEFILE" '

#
# extract note matching chapter+verse from notefile
#

function extract_note (notefile, chapter, verse) {
    note=""
    # command template
    template = "%s -x --chapter=%s --verse=%s --note-file=%s"
    # build command line
    command = sprintf(template, cmd, chapter, verse, notefile)
    # run command to extract note
    command | getline note
    close(command)
}


#
# insert corresponding note at location tagged by '*'
#

function insert_note() {

    buff = line
    while (index(buff, "*") > 0) {
	# at least 1 asterisk found -> need to insert note
	# restart à the beginning of the line
	buff = line
	# reset values
	asterisk_pos = 0
	end_note = 0
	position = 0
	# check '*' location
	while (end_note >= asterisk_pos) {
	    # this '*' is part of an end note tag '\f*', do not insert a note here
	    # get next '*' location in the buffer
	    asterisk_pos = index(buff, "*")
	    # get next end note tag '\f*' location in the buffer
	    end_note = index(buff, "\\f*") + 2
	    # save '*' position in the line
	    position = position + asterisk_pos
	    # buffering end of line from '*'
	    buff = substr (line , position + 1)
	}

	# extract note from notefile
	extract_note(notefile, chapter, verse)
	# insert note at location=position
	if (length(note) > 0) {
	    # note contains text, insert note at position
	    template = "%s\\f + \\fr %s,%s \\ft %s \\f*%s"
	    line = sprintf(template, substr(line, 1, position - 1), chapter, verse, note, substr(line, position + 1))
	}
	else {
	    # note is empty, insert info msg at position
	    template = "%s@MISSING_NOTE@%s"
	    line = sprintf(template, substr(line, 1, position - 1), substr(line, position + 1))
	    template = "Warning: %s: %s,%s MISSING NOTE at position %s\n"
	    printf template, notefile, chapter, verse, position > "/dev/stderr"
	}
    }
}


# main
{
    line=$0

# add paragraphs if needed

    while (! match(line, /^\\[a-z]+/)) {
	# no usfm header found, concat prevline + line
	line=prevline " " line
    }
}
# save chapter, verse
/^\\c\s/ {
    chapter = $2
}
/^\\v\s/ {
    verse = $2
    if (index($2, "-") > 0)
       verse = substr($2, 1, index($2, "-") - 1)
}
# insert note
{
    insert_note()
}
{
    # display result
    print line

    # prepare content for concatening paragraphs in case of multiline verses
    prevline=$0
}
' "$USFMFILE"

# remove empty failfile
[ "$(wc -c $FAILFILE | cut -d' ' -f1)" -lt "1" ] && rm -f "$FAILFILE"

}


# main

FAILFILE="$NOTEFILE.err"


if [ "$EXTRACT" ]; then
    extract
else
    insert
fi


# end

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

Hors ligne

#16 Le 03/12/2019, à 15:31

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Plutôt que de chercher à débuguer tout ça, en me basant sur ce que tu demandais dans ton premier message, j'ai écrit un petit script bash pour faire le travail, en essayant de minimiser le nombre de lignes, la complexité et l'appel à des programmes externes par rapport à ce qui précède :

#!/bin/bash

if ! [ -f "$1" ]; then
  echo "Veuillez donner un fichier d'entrée valide en premier argument du script."
  exit 1
fi

if [[ "$1" =~ \. ]]; then fnotes="${1%.*}_notes.${1##*.}"
else fnotes="${1}_notes"; fi

if ! [ -f "$fnotes" ]; then
  echo "Le fichier de notes $fnotes n'a pas été trouvé."
  exit 1
fi

while IFS='' read -r line; do
  case $line in
  "\\c "*) c=${line#* } ;;
  "\\v "*) v=$(cut -d' ' -f2 <<<"$line") ;;
  esac
  if [[ $line =~ \* ]]; then
    temp_line="${line%\**}\\f + \\fr $c,$v \\ft "
    temp_line+=$(awk -v n="$c,$v" '$1==n {sub(n"\\s+",""); printf "%s",$0}' "$fnotes")
    line="$temp_line\\f*${line#*\*}"
  fi
  echo "$line"
done <"$1"

Ce script prend en argument obligatoire le nom du fichier contenant le corps du texte (dans ton premier message 00_fichier.txt), il en déduit alors le nom du fichier de notes qui doit obligatoirement exister (00_fichier_notes.txt), et il écrit la concaténation du texte principal et des notes sur la sortie standard.

Attention aux points suivants :

  • les lignes du corps du texte ne sont censées contenir des étoiles (*) que aux endroits où une note doit être insérée, c'est-à-dire que l'étoile est sinon un caractère interdit dans le corps du texte ;

  • si l'étoile est précédée d'une espace, celle-ci sera conservée à la concaténation (contrairement à ton exemple du premier post, mais conformément au nouveau format en #23), et l'étoile est supposée être immédiatement suivie par la suite du texte (qui peut éventuellement être une espace, et qui sera donc aussi conservée, comme dans ton exemple en #1) ;

  • conformément au nouveau format en #23, le numéro introducteur des notes est de la forme « c,v » et non plus « c,v. » ;

  • ce script ne gère pas le cas où il y pourrait y avoir plusieurs étoiles par ligne, car tel qu'est présenté le problème, il ne devrait y en avoir qu'une (à cause de la numérotation des notes par chapitre/verset, qui, telle qu'elle est présentée, implique l'unicité). Si jamais il pouvait y avoir plusieurs étoiles par ligne, avec donc une numérotation plus complexe des notes, il faudrait un exemple plus complet et un peu plus de travail.

Essaie ça si tu veux, et dis moi ce qui manque, ce qui cloche, ce qu'il faudrait modifier, etc.

Dernière modification par kamaris (Le 03/12/2019, à 17:55)

Hors ligne

#17 Le 03/12/2019, à 15:34

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Ok merci j'essaye ça tout de suite.
Edit: Premier essaie. Je ne sais pas quel argument je dois mettre dans le script pour le fichier d'entré, sachant qu'ils ont tous un chiffre différent.
Pour faire simple les fichiers s'appellent 01.txt → 73.txt

Dernière modification par L'Africain (Le 03/12/2019, à 15:45)


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

Hors ligne

#18 Le 03/12/2019, à 15:51

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Il faut que tu le testes avec un de ces fichiers, ou bien que tu boucles sur la liste.
PS : j'ai légèrement modifié le script pour qu'il écrive sur la sortie standard, je ne sais pas pourquoi je n'avais pas fait ça dès le début.

Hors ligne

#19 Le 03/12/2019, à 16:00

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Il faut que tu le testes avec un de ces fichiers, ou bien que tu boucles sur la liste.

J'ai mis  "if ! [ -f "01" ];" après avoir renommé le fichier en 01, j'ai une sortie dans le terminal mais pas dans un fichier. Mais le contenu de la note n'est pas présent dans le fichier de sortie: ex:

\v 5 Nsemo, Nzambi bingaka yo “mwini”. Mudidi, yandi bingaka yo “mpimpa”. Nkokila kubwa, ntangu kubasika, yina kilumbu ya ntete*.\f + \fr 1,5 \ft \f*.
\p
\v 6 Nzambi tubaka nde: “Lufumba ya zulu* kuvanda na kati ya bamasa. Yo kukabisa bamasa ndambu na ndambu.”\f + \fr 1,6 \ft \f* kuvanda na kati ya bamasa. Yo kukabisa bamasa ndambu na ndambu.”

Dernière remarque, l'astérisque qui signale la note devrait avoir disparu (ou déplacé à la fin de la note. Je constate aussi qu'il n'y a pas d'espace avant les astérisques désignant l'emplacement de la note.
Après comment je fait pour faire une boucle?

Dernière modification par L'Africain (Le 03/12/2019, à 16:09)


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

Hors ligne

#20 Le 03/12/2019, à 17:32

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Ah oui, tes fichiers sont en .txt c'est vrai, donc c'est 01_notes.txt : j'ai modifié le script pour ça.
Par contre pour les astérisques, il faut qu'on se mette d'accord : soit il y a une espace avant, soit il n'y en a pas. Dans ton exemple du premier post, il y en a.
Peux-tu redonner un exemple de corps de texte/notes au format d'aujourd'hui ?

Hors ligne

#21 Le 03/12/2019, à 17:36

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Il n'y a pas d'espace avant l'astérisque je confirme. pour le txt j'avais modifié ça.


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

Hors ligne

#22 Le 03/12/2019, à 17:39

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Ok, alors est-ce que tu pourrais donner un exemple de fichier d'entrée, avec son fichier de notes associé ?

Hors ligne

#23 Le 03/12/2019, à 17:41

L'Africain

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Fichier d'entré 01:

\c 1
\p
\v 1 ...
\v 2...
\v 5 Nsemo, Nzambi bingaka yo “mwini”. Mudidi, yandi bingaka yo “mpimpa”. Nkokila kubwa, ntangu kubasika, yina kilumbu ya ntete*.
\p
\v 6 Nzambi tubaka nde: “Lufumba ya zulu* kuvanda na kati ya bamasa. Yo kukabisa bamasa ndambu na ndambu.”
\v 7 Nzambi gangaka lufumba ya zulu*. Yandi kabisaka masa yina kele na nsi ya lufumba ti masa yina kele na zulu na yo. Yo lutaka mutindu yina.

Fichier 01_notes:

1,5 Muntu ya kusonikaka mukanda yai zolaka ve kutendula luyantiku ya nsi-ntoto mvimba ti mutindu bantu ya ngangu ya bubu yai ke tendula yo. Mukanda yai me sonama ve na kikuma yina. Yandi zola kaka kusonga nde Nzambi muntu ya me ganga bima yai yonso ya beto ke mona.
Yo yina yandi kabisaka yo mutindu ya yandi vandaka kumona na zulu, na nzadi-mungwa, na ntoto, na bifulu yonso. Yandi ke tendula yo bonso nde Nzambi me sala yonso kaka na bilumbu sambanu, konso kilumbu kisalu mosi sambu yandi kupema na kilumbu ya nsambwadi (kisabato). Yo ke kwendila ti nsiku ya Nzambi kupesaka na bana ya Israel. Kansi beto zaba mbote nde Nzambi kugangaka ve bima yonso bonso muntu ya kisalu, kansi na ndinga na yandi kibeni: Yo kulunga kaka nde yandi yindula ye yo mpi ke salama buna. − Nsoniki (Mbuta-Nganga) ke sonika na kukembila Nzambi, sambu yandi gangaka bima yonso na ngindu ya mbote. Nsoniki ke ndima bangindu mingi ya bambuta ya ntangu yina, kansi yandi ke kotisa yo na kati ya masolo ya ke basika na ngindu na yandi ya kukembila Nzambi ya kieleka. Yo yina, kuyuvula nsoniki ve bangyuvula ya ke tadila bantu ya ngangu. Mu mbandu, kuyuvula ve nde: ‘Kilumbu mosi ya awa ke fwanana na bamvula kwa na meso ya bantu ya mayele?’ bonso nde bilumbu nsambwadi ya awa vandaka mpila mosi ba nsungi nsambwadi!
1,6 Lufumba ya zulu. Bambuta ya ntangu yina vandaka kuyindula nde: zulu ke fika ntoto bonso mpu ya ngolo-ngolo. Yo kele ya kufumbama bonso nkongolo. Nzambi me zika yo mbote-mbote na bansuka ya ntoto, bonso na makunzi zole: yo ke kwenda tuka nsuka mosi ya ntoto tii kuna nsuka yankaka. Na ngindu na bo, yo ke kanga masa na nima na yo. Ibuna ntangu Nzambi zola kunokisa mvula, yandi fwete kuzibula mabulu ya fioti ya yandi yidikaka na kati ya lufumba. Tanga mu mbandu Luy 7,11 ye Nke 77,23 ye Nke 103,3 ye Luk 4,25. − Na mambu ya ke tadila makunzi, tanga Nke 103,5 ye Nke 17,8.
1,7 Bana ya Israel, ti bantu yonso ya ntangu yina, vandaka kuyindula nde na zulu kele na mufinuku ya nene ya vandaka kukabisa nsi ntoto ti masa ya nene ya vandaka na zulu.

Dernière modification par L'Africain (Le 03/12/2019, à 18:07)


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

Hors ligne

#24 Le 03/12/2019, à 17:43

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

On ne peut pas travailler avec ça, il manque le numéro du chapitre dans le fichier d'entrée…
Il faudrait un exemple plus complet stp.

Dernière modification par kamaris (Le 03/12/2019, à 17:45)

Hors ligne

#25 Le 03/12/2019, à 17:57

kamaris

Re : [ Résolu ] Fusionner fichier de note dans autre fichier texte

Ton format avait aussi changé pour les notes : « 1,5 » et non plus « 1,5. »
J'ai modifié le script en conséquence.

Hors ligne