#1 Le 19/06/2012, à 10:19
- buzut
Sed dans une boucle avec une variable [RÉSOLU]
Hello à tous les ubunteros
Voici mon souci :
j'ai deux fichiers, a et b, contenant chacun une liste de mots. Tous les mots du fichier b sont à enlever du fichier a.
J'ai donc choisi de faire ça avec sed et une petite boucle while comme ceci,
while read f; do sed -i "/$f/d" a.txt; done < b.txt
malheureusement, le fichier retourné n'est pas "purifié" de tous les mots de la liste b… Je ne vois pas ce qui cloche
Merci d'avance
Dernière modification par buzut (Le 20/04/2013, à 15:55)
Hors ligne
#2 Le 19/06/2012, à 10:23
- pingouinux
Re : Sed dans une boucle avec une variable [RÉSOLU]
Bonjour,
C'est parce que s'il y a plusieurs mots sur une ligne du fichier b.txt, la variable $f les contient tous.
De plus, la commande sed va ici supprimer des lignes complètes de a.txt, même si elles contiennent des mots à conserver.
Dernière modification par pingouinux (Le 19/06/2012, à 10:31)
Hors ligne
#3 Le 19/06/2012, à 10:31
- buzut
Re : Sed dans une boucle avec une variable [RÉSOLU]
Merci de ta réponse rapide pingouinux
il n'y a justement qu'un seul mot par ligne dans les deux fichiers… Peu être un problème de formatage alors ?
je m'aperçois que le fichier a est "UTF-8 Unicode text", le b "ASCII text, with CRLF line terminators", c'est MSDOS ça d'ailleurs il me semble.
Je vais tenter de passer le b en UTF8
Edit :
De plus, la commande sed va ici supprimer des lignes complètes de a.txt, même si elles contiennent des mots à conserver.
Comme chaque ligne n'est constitué que d'un mot, c'est tout à fait ce que je cherche à faire !
Dernière modification par buzut (Le 19/06/2012, à 10:41)
Hors ligne
#4 Le 19/06/2012, à 18:38
- Hizoka
Re : Sed dans une boucle avec une variable [RÉSOLU]
Perso ca marche :
while read; do sed -i "/${REPLY}/d" a; done < b
avec pour fichier a :
chien
chat
poisson
caca
popo
et pour fichier b :
caca
popo
Donc c'est etrange que ca ne passe pas chez toi...
Si tu penses que ca vient de te fichiers, fais un test avec mon exemple et des nouveaux fichiers, tu verras vite si ca vient de ça ou non
Dernière modification par Hizoka (Le 19/06/2012, à 18:42)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 19/06/2012, à 18:54
- pingouinux
Re : Sed dans une boucle avec une variable [RÉSOLU]
Je viens de tester, et ça vient bien des <CR><LF> dans le fichier b.txt.
Hors ligne
#6 Le 19/06/2012, à 21:07
- pingouinux
Re : Sed dans une boucle avec une variable [RÉSOLU]
Essayer ceci :
for i in $(sed 's/\b/ /g' b.txt);do sed -i "s/\b$i\b//g" a.txt; done
Hors ligne
#7 Le 20/06/2012, à 06:00
- nesthib
Re : Sed dans une boucle avec une variable [RÉSOLU]
Une autre méthode que j'ai mentionnée il y a peu dans un autre fil : la commande comm, qui est faite pour ça.
Cela fonctionne si les fichiers sont triés, sinon il est possible de passer les fichiers triés (voir le lien ci-dessus), mais dans ce cas les solutions à base de sed/awk peuvent être plus intéressantes.
comm -23 fichier1 fichier2
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#8 Le 20/06/2012, à 10:09
- miniSeb
Re : Sed dans une boucle avec une variable [RÉSOLU]
Cool, je connaissais pas comm, merci
Hors ligne
#9 Le 20/06/2012, à 10:24
- pingouinux
Re : Sed dans une boucle avec une variable [RÉSOLU]
@nesthib #7 :
Pour info, si les lignes de fichier1 se terminent par <LF>, et celles de fichier2 par <CR><LF>, ou l'inverse, comm ne donne pas le bon résultat non plus.
Hors ligne
#10 Le 20/06/2012, à 14:17
- nesthib
Re : Sed dans une boucle avec une variable [RÉSOLU]
@pingouinux : oui, bien sûr
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#11 Le 21/06/2012, à 08:01
- buzut
Re : Sed dans une boucle avec une variable [RÉSOLU]
Salut !
Je n'avais pas vu toutes vos réponses ! Je m'en suis finalement sorti en virant les CR avec la commande tr :
In Unix, the character transliteration tool 'tr' exists
almost from the beginning.To remove CR=13(dec)=15(oct):
tr -d '\015' < infile.txt > outfile.txt
To remove LF=NL=10(dec)=12(oct)
tr -d '\012' < infile.txt > outfile.txt
To remove both:
tr -d '\015\012' < infile.txt > outfile.txt
... all just from the command line, no programming. You can also transliterate
other characters, of course, for instance a->d, b->e, c->f bytr 'a-c' 'd-f' < infile.txt > outfile.txt
In Linux, there will be mnemonics for meaningful character
subsets like '[:cntrl:]' and '[: punct:]'
solution trouvée ici.
Merci nesthib pour comm, à garder sous le coude
@pingouinux, du coup j'ai pas testé ta solution, mais je me met le thread en favoris, comme ça la prochaine fois, j'ai tout ce qu'il me faut !
Hors ligne