#1 Le 22/10/2011, à 13: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, à 18:13)
Hors ligne
#2 Le 22/10/2011, à 15: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, à 15:07)
Hors ligne
#3 Le 22/10/2011, à 15: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, à 15:26)
Hors ligne
#4 Le 22/10/2011, à 15: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, à 16:01)
Hors ligne
#5 Le 22/10/2011, à 15: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, à 16:00)
Hors ligne
#6 Le 22/10/2011, à 16: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, à 16: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, à 16: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, à 17: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, à 17:49)
Hors ligne
#10 Le 22/10/2011, à 17: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
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é , je suis un gros NOOB
Dernière modification par Miroslav (Le 22/10/2011, à 18:07)
Hors ligne
#11 Le 22/10/2011, à 17: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, à 17: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, à 18:12
- Miroslav
Re : récupérer différence entre deux fichiers [RESOLU]
diff <(sort fic1) <(sort fic2) |grep \<
Merci
Hors ligne
#14 Le 22/10/2011, à 18: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 22/10/2011, à 23:15
- sputnick
Re : récupérer différence entre deux fichiers [RESOLU]
Yop,
ya plus propre les gars
$ 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
$
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#16 Le 23/10/2011, à 13:37
- Totor
Re : récupérer différence entre deux fichiers [RESOLU]
ya plus propre les gars
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, à 13:38)
-- Lucid Lynx --
Hors ligne
#17 Le 24/10/2011, à 18: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, à 18:21)
Hors ligne
#18 Le 24/10/2011, à 19: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"
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#19 Le 24/10/2011, à 20: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, à 04: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, à 11:15)
Hors ligne
#21 Le 25/10/2011, à 11:05
- ehmicky
Re : récupérer différence entre deux fichiers [RESOLU]
Totor is back !
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, à 11:20
- Miroslav
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"
ok je vois, merci.
Hors ligne
#23 Le 25/10/2011, à 11:30
- sputnick
Re : récupérer différence entre deux fichiers [RESOLU]
Totor is back !
WelKome back ^^
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne