#1 Le 23/11/2019, à 09:57
- Anubis02
[RESOLU]fusionner partiellement des fichiers
Bonjour,
Je suis face à un cas qui dépasse quelque peu mes compétence en script:
Je dois fusionner des fichiers mais seulement en partie, je traduis:
Mes fichiers sont de cette forme:
texte
texte
texte
expression1
texte
[...]
texte
texte
expression2
texte
je dois fusionner la partie entre
expression1
et
expression2
tout en gardant ce qu'il y a autour pour le fichier le plus récent (c'est pas un soucis pour l'identifier) et le nombre de ligne entre les deux expressions est variable.
j'ai voulu tenté avec une boucle et un cat mais je n'ai pas réussi.
Merci d'avance pour ceux qui se pencheront dessus
Dernière modification par Anubis02 (Le 23/11/2019, à 12:56)
Hors ligne
#2 Le 23/11/2019, à 10:25
- pingouinux
Re : [RESOLU]fusionner partiellement des fichiers
Bonjour,
Montre déjà ce que tu as essayé, et ce serait plus facile si tu donnais un exemple de fichiers, ainsi que le résultat que tu souhaites.
Hors ligne
#3 Le 23/11/2019, à 10:26
- nany
Re : [RESOLU]fusionner partiellement des fichiers
Bonjour,
Je ne sais pas si j’ai bien compris le problème mais voilà peut-être un début de solution :
sed -n '/expression1/,/expression2/p' fichier1 fichier2
Hors ligne
#4 Le 23/11/2019, à 10:45
- Anubis02
Re : [RESOLU]fusionner partiellement des fichiers
Voici la forme de mes fichiers:
timestamps:
login: 1568996854713
lastteleport: 1568664411222
logout: 1568996860478
ipAddress: XX.XX.XX.XX
lastlocation:
world: world
x: 1226.1538554060564
y: 72.0
z: 5058.619263776966
yaw: -358.30676
pitch: 0.30027223
homes:
home:
world: NewAD
x: 261.79933244996124
y: 89.0
z: 4960.770041283502
yaw: -352.1779
pitch: 28.499931
a:
world: NewAD
x: -542.4555730136376
y: 63.0
z: -7.668588489478434
yaw: 285.89948
pitch: 14.399999
b:
world: NewAD
x: 253.32308943638503
y: 76.0
z: 4927.767540722335
yaw: 126.16699
pitch: 47.549946
logoutlocation:
world: world
x: -48.51154508271123
y: 66.4859999999404
z: -187.5261038133722
yaw: 170.69951
pitch: 18.9
Je veux fusionner les homes ( nous fusionnons deux serveurs minecraft qui on pas mal d'utilisateurs communs sur un multiverse) donc tout ce qui se trouve entre "homes:" et "logoutlocation:"
voici où je suis:
#!/bin/bash
dossier1=/home/jbernard/NextGen/userdata
dossier2=/home/jbernard/NextGen/userdata_conv
dossier3=/home/jbernard/NextGen/merge
if [ -d $dossier3 ] ; then
rm -R $dossier3
fi
mkdir $dossier3
for fic1 in `ls $dossier1` ; do
test1=test2="0"
for texte in `cat $dossier1/$fic1` ; do
if [ $texte == "homes:" ] ; then
test1="1"
elif [ $texte == "logoutlocation:" ] ; then
test2="1"
fi
if [ $test1 == "1" ] && [ $test2 == "0" ] ; then
echo $texte
fi
done
done
et pour le moment je n'ai pas de retour
Hors ligne
#5 Le 23/11/2019, à 11:02
- Anubis02
Re : [RESOLU]fusionner partiellement des fichiers
Bonjour,
Je ne sais pas si j’ai bien compris le problème mais voilà peut-être un début de solution :
sed -n '/expression1/,/expression2/p' fichier1 fichier2
Merci c'est un bon début, juste que les informations ne sont pas dans le bon ordre mais on avance
Hors ligne
#6 Le 23/11/2019, à 11:08
- nany
Re : [RESOLU]fusionner partiellement des fichiers
Sed -n '/homes:/,/logoutlocation:/p' "${dossier1}/*" | sed '/homes:/d;/logoutlocation/d'
Dernière modification par nany (Le 23/11/2019, à 11:09)
Hors ligne
#7 Le 23/11/2019, à 11:44
- Watael
Re : [RESOLU]fusionner partiellement des fichiers
quand une commande, telle que sed, est pipée à elle-même, il est fort probable qu'une seule puisse faire tout le travail :
sed -n '/homes:/,/logoutlocation:/{/homes:\|logoutlocation/!p;}' "$dossier1"/*
Dernière modification par Watael (Le 23/11/2019, à 12:44)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 23/11/2019, à 12:06
- nany
Re : [RESOLU]fusionner partiellement des fichiers
Merci Watael !
J’avais cherché sans trouver le moyen de ne pas piper.
J’ai testé, ça marche.
Hors ligne
#9 Le 23/11/2019, à 12:55
- Anubis02
Re : [RESOLU]fusionner partiellement des fichiers
Merci beaucoup ça marche, j'ai réussi en plaçant les homes à la fin (ça passe dans la syntaxe du fichier).
Si ça peut servir, voici ce que donne le code
#!/bin/bash
dossier1=/home/jbernard/newAdNextGen/userdata_newAD_test
dossier2=/home/jbernard/newAdNextGen/userdata_conv_newAD_test
dossier3=/home/jbernard/newAdNextGen/merge
if [ -d $dossier3 ] ; then
rm -R $dossier3
fi
mkdir $dossier3
for fic1 in `ls $dossier1` ; do
if [ -f $dossier2/$fic1 ] ; then
rempl1=`sed -n '/homes:/,/logoutlocation/{/homes:\|logoutlocation/!p}' $dossier1/$fic1`
rempl2=`sed -n '/homes:/,/logoutlocation/{/homes:\|logoutlocation/!p}' $dossier2/$fic1`
sed '/homes:/,/logoutlocation/d' $dossier1/$fic1 > $dossier3/a$fic1
sed '/homes:/d' $dossier3/a$fic1 > $dossier3/$fic1
echo "homes:
$rempl1
$rempl2" >> $dossier3/$fic1
rm $dossier3/a$fic1
else
#cp $dossier1/$fic1 $dossier3/$fic1
echo $fic1 ok
fi
done
exit 0
Hors ligne
#10 Le 23/11/2019, à 13:09
- Watael
Re : [RESOLU]fusionner partiellement des fichiers
grrr!
for f in "$dossier"/*
do
if test -f "$f"
then
: ...
# sed '...' "$f"
pour comprendre pourquoi, crée un fichier "$dossier/un_ _fichier" (remarque l'espace entre les soulignements).
Dernière modification par Watael (Le 23/11/2019, à 13:11)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne