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 04/08/2019, à 21:10

L'Africain

Améliorer script de fusion de deux fichiers

Bonjour,
Il  y a quelques années on m'a aidé pour écrire un script qui permet la fusion deux fichiers, un de notes (avec l'extension TXT), l'autre le texte dans lequel mettre les notes (avec l'extension usfm).
Voici le script en question:

#!/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 texte *.usfm
for item in {0..80}

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

J'ai deux petits problèmes, le premier c'est que le script ne tiens pas compte des retours à la ligne éventuel dans les notes (toujours numérotées par le chap et le verset ex: 4, 11) et le second c'est que quelque fois la note est dans le titre qui précède le verset, par exemple:

\s mon titre*
\p
\v 3 Mon texte

La note du verset 3 devrait venir alors au niveau de l'* du titre.
Enfin s'il était possible de couper la note du fichier source TXT pour y voir plus clair si éventuellement il fallait finir le travail manuellement ça serait formidable.
Merci d'avance


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

Hors ligne

#2 Le 07/08/2019, à 15:00

LeoMajor

Re : Améliorer script de fusion de deux fichiers

bonjour

On ne connaît plus la situation de départ et d'arrivée. Personnellement, je ne m'en rappelle plus.
Si tu veux que ce soit portable, il te faut modéliser la structure de tes données en variables ( collection, dico, liste de listes d'éléments, variable objet, tables sql avec clef étrangère,  json, ... ; choisis la formule qui te convient).  Ton approche est trop visuelle, trop axée sur l'affichage, alors qu'en général, c'est  le dernier des soucis.  En clair, il n'y a pas assez d'abstraction. Donc pas portable. ou alors tu demandes la formulation du patch/diff/merge au développeur qui a écrit les sources de tes données ?!

Hors ligne

#3 Le 07/08/2019, à 15:22

xubu1957

Re : Améliorer script de fusion de deux fichiers

Bonjour,

C'était cette discussion > Fusionner fichier de note dans autre fichier texte (Résolu) ?


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

Hors ligne

#4 Le 07/08/2019, à 15:42

L'Africain

Re : Améliorer script de fusion de deux fichiers

@Xubu, oui c'est bien cette discussion.
@LeoMajor, le lien vers l'ancienne discussion est-il suffisant?


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

Hors ligne

#5 Le 07/08/2019, à 21:10

LeoMajor

Re : Améliorer script de fusion de deux fichiers

oui j'ai vu.

cat 00_fichier.txt

\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;

cat 00_fichier_notes.txt

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.
1,S    kinshasa muanda matuidi

quelque fois la note est dans le titre qui précède le verset

tu dois le formuler explicitement, sinon, tu ne peux pas appliquer de règle d'écriture
ex
1,S    kinshasa muanda matuidi

à essayer

awk  '$1~/^[0-9]+\,[S0-9]+$/ { tmp=$1; $1=""; refs[tmp]=$0; $1=tmp }; $1=="\\c" {rf=$2};  $0~/^\\s.*[*]/ {sub(/*/,"\\f + \\fr "rf",S \\ft "refs[rf",S"]" \\f*",$0)}; $0~/^\\v.*[*]/ {sub(/*/,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2]" \\f*",$0)};  NR!=FNR{print}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt

renvoie

\c 1
\s Nzambe, Mozalisi walikolo \f + \fr 1,S \ft  kinshasa muanda matuidi \f* 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;

si tu veux voir le 1er fichier, tu mets NR==FNR
si tu veux voir le second tu mets NR!=FNR
si tu veux voir les 2 , tu ne mets rien (debug)

Dernière modification par LeoMajor (Le 07/08/2019, à 21:13)

Hors ligne

#6 Le 08/08/2019, à 16:28

L'Africain

Re : Améliorer script de fusion de deux fichiers

Désolé pour le délai!
Merci LeoMajor, je vais donc essayer d'être plus précis dans ma description.
dans le cas d'un titre qui commence par \s la note qui le suit concerne toujours le verset juste après. Par exemple, la note 1,3 aura pour correspondance dans le fichier usfm:

\s mon titre*
\p
\v 3 contenu du verset 3.

Pour l'linstant le script modifié fonctionne comme avant mais en cas de note après un titre il y mets les balises \f mais le contenu de la note n'y est pas ni le numéro du verset qui est remplacé par le "s" de la balise qui précède, par exemple:

\s2 Nzambi me ganga muntu: bakala ti nkento\f + \fr 2,S \ft  \f*
\p Kilumbu ya Mfumu Nzambi gangaka ntoto ti zulu,
\v 5

devrait être:

\s2 Nzambi me ganga muntu: bakala ti nkento\f + \fr 2,5 \ft Contenu de ma note.\f*
\p Kilumbu ya Mfumu Nzambi gangaka ntoto ti zulu,
\v 5

Après je ne sais pas si c'est possible mais si durant la fusion on pouvait supprimer du fichier note ce qui est automatiquement intégré au fichier usfm ça pourrait m'aider à savoir ce qui manque dans le fichier fusionné.
Merci encore.


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

Hors ligne

#7 Le 09/08/2019, à 18:58

LeoMajor

Re : Améliorer script de fusion de deux fichiers

à ajouter

$0~/^\\s .*[*]/ { found=0; til=$0; while(found==0){getline; if($1=="\\v"){back=$1" "$2; srf=$2; $1=$2=""; vv=$0; sub(/[*]/,"\\f + \\fr "rf","srf" \\ft "vv" \\f*",til); print til; for (i=1;i<=c;i++)print foo[i]; found=1; $0=back }else{c++; foo[c]=$0  }}}

cela donne

\c 1
\s Nzambe, Mozalisi walikolo \f + \fr 1,1 \ft   O libandela Nzambe akeli likolo na nse. \f* nanse
\r vanille
\p
\r fraise
\v 1
\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.
...

si tu veux que \v 1 soit supprimé, tu mets $0=back="" au lieu de $0=back

à modifier ( si $0 existe )

NR!=FNR{if($0)print}  

l'hypothèse de départ est

\c 1
\s Nzambe, Mozalisi walikolo * nanse
\r vanille
\p
\r fraise
\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;

est-ce utile \s2 ?

Hors ligne

#8 Le 09/08/2019, à 19:44

L'Africain

Re : Améliorer script de fusion de deux fichiers

Bonsoir,
Ça progresse dans le sens où j'ai bien le numéro de verset desormais dans le fichier fusionné, mais le contenu de la note n'est pas le bon, c'est le contenu du verset en question:

\s2 Nzambi me ganga muntu: bakala ti nkento\f + \fr 2,5 \ft   ICI AULIEU DU TEXTE DE LA NOTE J'AI LE TEXTE DU VERSET 5 QUI LUI RESTE VIDE\f*
\p Kilumbu ya Mfumu Nzambi gangaka ntoto ti zulu,
\v 5
\v 6 Kansi masa

Pour la suppression c'est les notes que je souhaterais supprimer et non le verset.
J'ai repris aussi le bout de code initial, pour ne pas avoir l'erreur du #6, j'ai donc:

#!/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 texte *.usfm
for item in {0..80}

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)
};
$0~/^\\s.*[*]/ { found=0; til=$0; while(found==0){getline; if($1=="\\v"){back=$1" "$2; srf=$2; $1=$2=""; vv=$0; sub(/[*]/,"\\f + \\fr "rf","srf" \\ft "vv" \\f*",til); print til; for (i=1;i<=c;i++)print foo[i]; found=1; $0=back }else{c++; foo[c]=$0  }}} {print}'  "${id}.TXT"  "${id}.usfm"

done

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

Hors ligne

#9 Le 10/08/2019, à 18:06

LeoMajor

Re : Améliorer script de fusion de deux fichiers

cat 00_fichier.txt

\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 * kaboli mai mazali o nse ya etando na mai mazali likolo;
\s2 clio picasso mini * espace 
\p
\s3 vanille * fraise pistache
\p
\v 8 aaaaa
\v 9 bbbbb

cat 00_fichier_notes.txt

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.
1,s    kinshasa matadi muanda
1,s2   1,7
1,s3   goma kigali
awk  '$1~/^[0-9]+\,[s0-9]+/ { file1=$0; if($2~/^[0-9]+\,[0-9]+$/){refs[$1]=refs[$2]}else{tmp=$1; $1=""; refs[tmp]=$0 }}; $1=="\\c" {rf=$2}; $0~/^\\s[0-9]* .*[*]/ { ss=substr($1,2,4) ; sub(/[*]/,"\\f + \\fr "rf","ss" \\ft "refs[rf","ss]" \\f*",$0); file1="" } ; $1=="\\v" && /[*]/ { sub(/[*]/,"\\f + \\fr "rf","$2" \\ft "refs[rf","$2]"\\f*",$0)}; FNR==NR{if(file1)print "file1",file1}; FNR!=NR{if($0)print}'  /tmp/00_fichier_notes.txt  /tmp/00_fichier.txt

file1 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.
file1 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.
file1 1,s    kinshasa matadi muanda
file1 1,s2   1,7
file1 1,s3   goma kigali
\c 1
\s Nzambe, Mozalisi \f + \fr 1,s \ft  kinshasa matadi muanda \f* 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* kaboli mai mazali o nse ya etando na mai mazali likolo;
\s2 clio picasso mini \f + \fr 1,s2 \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* espace 
\p
\s3 vanille \f + \fr 1,s3 \ft  goma kigali \f* fraise pistache
\p
\v 8 aaaaa
\v 9 bbbbb

si il y a des choses qui manquent, tu adaptes et puis voilà ....
je considère que le sujet est clos (trop de calculs intermédiaires dans tes topics (sed++ awk++ ...) , manque de portabilité).
bon week-end

Hors ligne