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 22/10/2011, à 14:03

Miroslav

récupérer différence entre deux fichiers [RESOLU]

Bonjour,

j'utilise diff mais il me donne une différence ligne par ligne, j'aimerais faire l'équivalent d'une soustraction de contenu entre deux fichiers

en gros Fichier 1 - Fichier 2 = contenu restant

d'avance merci

Merci

Dernière modification par Miroslav (Le 22/10/2011, à 19:13)

Hors ligne

#2 Le 22/10/2011, à 16:07

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

diff fic1 fic2 | grep \<

Si tu veux fic2 - fic1:

diff fic1 fic2 | grep \>

Edit:  puis tu peux enlever les < et > avec sed s'il le faut.

Dernière modification par aduxas (Le 22/10/2011, à 16:07)

Hors ligne

#3 Le 22/10/2011, à 16:26

Miroslav

Re : récupérer différence entre deux fichiers [RESOLU]

Je vois mais ça ne fonctionne pas comme je voudrais. Diff ne fait pas une soustraction mais compare ligne par ligne. Je crois que je devrais faire un petit script.

Dernière modification par Miroslav (Le 22/10/2011, à 16:26)

Hors ligne

#4 Le 22/10/2011, à 16:46

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

Bonjour,

Est-ce que ceci convient ?

while read lig; do grep -q "^$lig$" fic2 || echo "$lig";done <fic1 >resultat

Attention : Ne tient pas compte des espaces en début et fin de lignes

Dernière modification par pingouinux (Le 22/10/2011, à 17:01)

Hors ligne

#5 Le 22/10/2011, à 16:54

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

Ca donne exactement la même chose.  Je pense que Miroslav veut comparer mot à mot(*).  On pourrait remplacer les séparateurs de mot par des \n puis appliquer diff.  S'il veut recoller après, il faudra quelques manips.

-> (*)  ou caractère à caractère?

Dernière modification par aduxas (Le 22/10/2011, à 17:00)

Hors ligne

#6 Le 22/10/2011, à 17:05

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

@aduxas : il y a une différence entre nos deux méthodes si les lignes identiques ne sont pas dans le même ordre dans les fichiers fic1 et fic2. C'est à Miroslav de préciser ce qu'il veut.

Hors ligne

#7 Le 22/10/2011, à 17:19

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

D'accord pour l'ordre, mais ta méthode est en n au carré :  beurk!  Il vaut mieut faire un tri.  "join" pourrait servir aussi.

Hors ligne

#8 Le 22/10/2011, à 17:21

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

@aduxas #7 :
Tu as raison, mais ça ne devient important que pour des fichiers conséquents.

Hors ligne

#9 Le 22/10/2011, à 18:23

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

Voici une méthode rapide, mais qui ne garde qu'un exemplaire des lignes en double du fichier fic1 :

#! /bin/bash

# ligs : tableau associatif (les indices sont des chaînes de caractères et non des entiers)
unset ligs; declare -A ligs

# On définit autant d'éléments du tableau que de lignes différentes dans fic1
# L'indice est le contenu de la ligne, et il est inutile de donner un valeur à l'élément
while read lig
do
   ligs["$lig"]=
done <fic1

# Pour chaque ligne de fic2, on rend l'élément correspondant du tableau (s'il existe) indéfini
while read lig
do
   unset ligs["$lig"]
done <fic2

# On boucle sur les indices qui restent dans le tableau pour les imprimer (ordre aléatoire)
for i in "${!ligs[@]}"
do
   echo $i
done >resultat

Dernière modification par pingouinux (Le 22/10/2011, à 18:49)

Hors ligne

#10 Le 22/10/2011, à 18:30

Miroslav

Re : récupérer différence entre deux fichiers [RESOLU]

Oula, je suis en retard...

Bon, j'ai résolu mon problème, je ne sais pas si c'est très académique mais bon...

while read line1 ; do
 line2=$(cat ./.file2 | grep "$line1")
 if [ "$line1" = "$line2" ]
  then
  echo "$line1 OK"
 else
  echo "$line1" >> ./file3
 fi
done < ./.file1

J'ai jetté un oeil à vos propositions, ça m'a l'air plus simple... je vais essayer de m'en inspirer

Dans tous les cas Merci smile

edit: Je viens de voir la dernière proposition, c'est un peu chaud à piger pour moi
unset... declare... déjà la je suis paumé roll , je suis un gros NOOB lol

Dernière modification par Miroslav (Le 22/10/2011, à 19:07)

Hors ligne

#11 Le 22/10/2011, à 18:50

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

J'ai ajouté des commentaires dans #9

Hors ligne

#12 Le 22/10/2011, à 18:58

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

diff <(sort fic1) <(sort fic2) |grep \<

Hors ligne

#13 Le 22/10/2011, à 19:12

Miroslav

Re : récupérer différence entre deux fichiers [RESOLU]

aduxas a écrit :
diff <(sort fic1) <(sort fic2) |grep \<

cool

Merci

Hors ligne

#14 Le 22/10/2011, à 19:37

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

De rien.  Ce serait très intéressant de comparer les vitesses des deux méthodes (#9 et #12) sur de très gros fichiers.  La méthode pingouinux #9 semble  linéaire, mais les tableaux associatifs utilisent des hash, qui ne le sont pas.  Difficile à dire.

Hors ligne

#15 Le 23/10/2011, à 00:15

sputnick

Re : récupérer différence entre deux fichiers [RESOLU]

Yop,

ya plus propre les gars wink

$ cat /tmp/a
zzzz
eeee
rrrr
yyyy
uuuu
iiii
$ cat /tmp/b
yyyy
aaaa
zzzz
rrrr
eeee
uuuu
iiii
$ comm -3 <(sort /tmp/a)  <(sort /tmp/b)
        aaaa
$

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#16 Le 23/10/2011, à 14:37

Totor

Re : récupérer différence entre deux fichiers [RESOLU]

sputnick a écrit :

ya plus propre les gars wink

c'est claire ...

diff sait aussi le faire, mais il faut le lui demander :

$ cat A
zzzz
eeee
rrrr
yyyy
uuuu
iiii
mmmm

$ cat B
yyyy
aaaa
zzzz
rrrr
eeee
uuuu

$ diff  --old-line-format='%L' --unchanged-line-format=  --new-line-format= <(sort A) <(sort B)
mmmm

il y a une légère différence (sur le résultat) avec la méthode de sputnick (que l'on peut également obtenir en modifiant la valeur de --new-line-format)

Dernière modification par Totor (Le 23/10/2011, à 14:38)


-- Lucid Lynx --

Hors ligne

#17 Le 24/10/2011, à 19:19

Miroslav

Re : récupérer différence entre deux fichiers [RESOLU]

Sorry je suis un noob, ces commandes avec diff et comm me vont niquelle, par contre comment je peux les intégrer à un script bash svp?
Actuelement j'ai une erreure du style "unexpected ")"..."

Dernière modification par Miroslav (Le 24/10/2011, à 19:21)

Hors ligne

#18 Le 24/10/2011, à 20:35

sputnick

Re : récupérer différence entre deux fichiers [RESOLU]

C'est vague comme requête, au mieux je pense que tu cherche à récupérer la sortie de la commande dans une variable :

zupaVariableDeLaMortKiTu=$(
    comm -3 <(sort /tmp/a)  <(sort /tmp/b)
)
echo "$zupaVariableDeLaMortKiTu"

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#19 Le 24/10/2011, à 21:55

aduxas

Re : récupérer différence entre deux fichiers [RESOLU]

Petite remarque:  "comm" ne donne pas tout à fait la bonne réponse.  Il imprime toutes lignes uniques; sans tabulation pour les lignes uniques au premier fichier; avec tabulation pour les lignes uniques au second.

Hors ligne

#20 Le 25/10/2011, à 05:09

pingouinux

Re : récupérer différence entre deux fichiers [RESOLU]

Bonjour,
@aduxas #19 : Pour n'avoir que les lignes uniques du premier fichier

comm -23 .....

Dernière modification par pingouinux (Le 25/10/2011, à 12:15)

Hors ligne

#21 Le 25/10/2011, à 12:05

ehmicky

Re : récupérer différence entre deux fichiers [RESOLU]

Totor is back ! smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#22 Le 25/10/2011, à 12:20

Miroslav

Re : récupérer différence entre deux fichiers [RESOLU]

sputnick a écrit :

C'est vague comme requête, au mieux je pense que tu cherche à récupérer la sortie de la commande dans une variable :

zupaVariableDeLaMortKiTu=$(
    comm -3 <(sort /tmp/a)  <(sort /tmp/b)
)
echo "$zupaVariableDeLaMortKiTu"

ok je vois, merci.

Hors ligne

#23 Le 25/10/2011, à 12:30

sputnick

Re : récupérer différence entre deux fichiers [RESOLU]

ehmicky a écrit :

Totor is back ! smile

WelKome back ^^


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne