Pages : 1
#1 Le 10/08/2010, à 12:30
- Tomzz
commande diff je craque...
Bonjour,
Je cherche à faire:
diff /fichier1 /fichier2 > /fichier3
Dans le but de trouver dans le fichier3 les lignes communes aux deux fichiers 1 et 2, et uniquement celles là, sans caractères rajoutés (<>- ou autre)
J'ai aussi essayé
comm -1 -2 /fichier1 /fichier2 > /fichier3
Je souhaiterai ignorer les différences de nombre d'espaces
Pour le moment, un coup ça marche, un coup non, je crois que ça dépand de si c'est fichier1 ou 2 qui a le plus grand nombre de lignes.
PS: voilà les lignes telle que je les utilises
Pour le premier script (là ça semble marcher)
diff $HOME/scripts/apt-mirror/dep-dispo-dist1 $HOME/scripts/apt-mirror/dep-dispo-dist | eval $gr | grep -E "[+-]" | sed 's/<//g' | sed 's/---//g' >> $HOME/scripts/apt-mirror/dep-dispo-dist
Pour l'autre scipt (là rien a faire)
diff $HOME/scripts/apt-mirror/dep-url.dispo $HOME/scripts/apt-mirror/dep-url.temp | grep -E "[+-]" | sed 's/<//g' | sed 's/---//g' > $HOME/scripts/apt-mirror/dep-url
J'ai aussi tenté
comm -1 -2 $HOME/scripts/apt-mirror/dep-url.temp $HOME/scripts/apt-mirror/dep-url.dispo > $HOME/scripts/apt-mirror/dep-url
Hors ligne
#2 Le 10/08/2010, à 12:34
- sputnick
Re : commande diff je craque...
comm <options> <(column -t fichier1) <(column -t fichier2)
?
Dernière modification par sputnick (Le 10/08/2010, à 12:38)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#3 Le 10/08/2010, à 12:44
- Tomzz
Re : commande diff je craque...
comm <options> <(column -t fichier1) <(column -t fichier2)
?
Je ne comprend pas ?
dans le man j'ai:
comm [OPTION]... FILE1 FILE2
Désolé, je sais bien que je suis surement en train de tourner autour d'une évidence, mais pourrais tu me coller un exemple stp.
Hors ligne
#4 Le 10/08/2010, à 12:46
- sputnick
Re : commande diff je craque...
Voici ce que je viens de tester avec succes :
cat>/tmp/aa<<EOF
a z f
q s d
q s h
EOF
cat>/tmp/bb<<EOF
a z f
q a z
m p o
EOF
comm --nocheck-order -12 <(column -t /tmp/aa) <(column -t /tmp/bb)
a z f
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#5 Le 10/08/2010, à 13:01
- Tomzz
Re : commande diff je craque...
Merci,
Ça marche avec ça:
comm --nocheck-order -12 $HOME/scripts/apt-mirror/dep-url.temp $HOME/scripts/apt-mirror/dep-url.dispo > $HOME/scripts/apt-mirror/dep-url
P'tain ça fais au moins 3 heures que je m'entête avec diff et comm j'étais passé un peu vite
Hors ligne
#6 Le 10/08/2010, à 13:53
- ehmicky
Re : commande diff je craque...
comm est normalement prévu pour les fichiers triés alphabétiquement, l'option --nocheck-order supprime le message d'erreur mais ne supprime pas le comportement de comm qui est d'être plus adapté aux fichiers triés. diff permet permet par ailleurs bien plus d'options (dont le fait d'ignorer les "espaces"), mais comm peut suffir si tu utilises l'output de comm juste pour toi et non dans un patch ou autre.
Par exemple, prends n'importe quel fichier, et compare-le avec une version de ce fichier sont les lignes sont complètement mélangées. comm te diras que de nombreuses lignes sont différentes, sous prétexte qu'elles ne sont pas dans le même ordre. Essaie par exemple, pour un fichier qu'on nommera FILE :
comm --nocheck-order -12 FILE <(shuf FILE)
(shuf mets en désordre les lignes de FILE)
Donc avec comm, il faut trier avant la comparaison, d'où un :
comm -12 <(sort FILE1) <(sort FILE2)
Sinon, pour le fait d'ignorer les "espaces", tu peux utiliser l'option -w de diff :
diff -wU0 <(sort FILE1) <(sort FILE2) | tail -n+3
L'option -B ignore aussi les différences dues à des lignes vides.
PS : la syntaxe <( ) signifie la même chose que $( ) ou ` `, sauf que $( ) produit une string, et <( ) produit un fichier en sortie (un filedescriptor). Ainsi vu que comm a besoin d'un fichier comme argument, il faut utiliser <( ) et non $( )
Dernière modification par ehmicky (Le 10/08/2010, à 17:18)
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
#7 Le 10/08/2010, à 17:49
- Tomzz
Re : commande diff je craque...
PS : la syntaxe <( ) signifie la même chose que $( ) ou ` `, sauf que $( ) produit une string, et <( ) produit un fichier en sortie (un filedescriptor). Ainsi vu que comm a besoin d'un fichier comme argument, il faut utiliser <( ) et non $( )
Alors ça c'est génial, sauf que maintenant il va falloir que je reprenne mes scripts avec
Sinon, comm va bien mais avec diff je n'arrive toujours à rien
Je détaille ce que j'ai fait:
dep-url.dispo contient:
dl.google.com
liveusb.info
dep-url.temp contient:
archive.canonical.com
dl.google.com
fr.archive.ubuntu.com
fr.packages.medibuntu.org
liveusb.info
lprod.org
packages.medibuntu.org
ppa.launchpad.net
security.ubuntu.com
Je fais:
diff -wU0 <(sort $HOME/scripts/apt-mirror/dep-url.dispo) <(sort $HOME/scripts/apt-mirror/dep-url.temp) | tail -n+3 > $HOME/scripts/apt-mirror/dep-url
(je ne comprend d'ailleurs pas ce que fait tail ici, pourquoi les 3 dernières lignes ?)
et je me retrouve avec dep-url qui contient:
@@ -0,0 +1,2 @@
+
+archive.canonical.com
@@ -1,0 +4,2 @@
+fr.archive.ubuntu.com
+fr.packages.medibuntu.org
@@ -2,0 +7,4 @@
+lprod.org
+packages.medibuntu.org
+ppa.launchpad.net
+security.ubuntu.com
Alors que je voudrais juste obtenir:
dl.google.com
liveusb.info
sputnick a déjà résolu mon problème (je fais un sort | uniq sur ces fichiers un peu plus haut), mais pour ma culture perso j'aimerai comprendre diff
Hors ligne
#8 Le 10/08/2010, à 18:24
- ehmicky
Re : commande diff je craque...
Merde, désolé, effectivement diff te donne les lignes différentes et tu veux les lignes identiques ^^
Pour diff (avec le formattage produit par l'option -U) :
- Les lignes étranges entourées de "@@ @@" t'indiquent les numéro de lignes concernées. Pour être précis @@ -A,B +C,D @@ signifie que les lignes concernées dans le premier fichier sont les B + 1 lignes à partir de la ligne numéro A, et que les lignes concernées dans le second fichier sont les D+1 lignes à partir de la ligne numéro C. Si ce qui suit est précédé d'un +, il s'agit d'un ajout de ligne, sinon, d'une suppression de ligne.
- le tail -n+3 servait à supprimer les 2 première lignes de l'output de diff -U0, qui font référence aux noms des fichiers comparés et à leur date de dernière modification.
Mais bon, comme tu le dis, effectivement, je suis hors-sujet là vu que tu veux utiliser l'output des lignes identiques, et sans toutes les fioritures produites par diff.
Par contre, pour comm, n'oublies pas de faire un :
<(sort FILE)
et non un FILE tout court, sinon tu auras des mauvais résultats.
Dernière modification par ehmicky (Le 10/08/2010, à 18:24)
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
#9 Le 10/08/2010, à 23:44
- Tomzz
Re : commande diff je craque...
Merci,
Ça marche avec ça:comm --nocheck-order -12 $HOME/scripts/apt-mirror/dep-url.temp $HOME/scripts/apt-mirror/dep-url.dispo > $HOME/scripts/apt-mirror/dep-url
P'tain ça fais au moins 3 heures que je m'entête avec diff et comm j'étais passé un peu vite
Ben en fait non, ça ne marche pas.
Ce truc me rend dingue, tout à l'heure c'était ok, je relance mon script et maintenant j'obtiens un fichier vide.
J'ai aussi essayé ça:
comm --nocheck-order -12 <(sort $HOME/scripts/apt-mirror/dep-url.temp) <(sort $HOME/scripts/apt-mirror/dep-url.dispo) > $HOME/scripts/apt-mirror/dep-url
Hors ligne