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

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 wink

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 smile

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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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 smile

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 wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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 :

kunstkopf a écrit :

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 by

tr '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 big_smile

@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