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

nany a écrit :

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