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 07/01/2014, à 18:27

Arbiel

Extraction des lignes d'un fichier A sans équivalence dans fichier B

Bonsoir

Il s'agit là plutôt d'un pense-bête pour moi, mais, si vous avez plus simple, merci d'en faire profiter la communauté

A=fichier_à_exploiter
B=fichier_lignes_à_supprimer
sed -e "s/^.*$/^&$/g" "${B}" | grep -vf /dev/stdin "${A}" > résultat

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 07/01/2014, à 18:34

Postmortem

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Salut,

awk 'NR==FNR{ligne[$0]=1; next} !ligne[$0]' "$B" "$A"

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 08/01/2014, à 13:40

Arbiel

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Bonjour

Je ne connais awk que de nom.

Je me suis penché sur la documentation (man awk) sans avoir cependant réussi à comprendre le fonctionnement de la commande proposée par Postmortem. Mais c'est une seconde manière de procéder.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 08/01/2014, à 15:08

Postmortem

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Salut,
NR : numéro de la ligne en cours de lecture
FNR : numéro de la ligne en cours de lecture dans le fichier en cours
FNR repasse à 1 à chaque première ligne d'un fichier alors que NR continue de s'incrémenter.
NR==FNR n'est donc vrai que pour le 1er fichier ("$B" dans notre cas).
$0 : c'est la ligne en cours de traitement.
Pour chaque ligne de ce premier fichier, on ajoute un élément au tableau nommé ligne.
Si le fichier "$B" contient ceci :

$B a écrit :

tata
toto
titi

Cela va créé le tableau ainsi :

ligne["tata"]=1
ligne["toto"]=1
ligne["titi"]=1

L'instruction next permet de passer à la ligne suivante du fichier sans s'occuper du reste des commandes (!ligne[$0] n'est donc pas exécuté pour le premier fichier).

Quand on arrive au 2ème fichier, NR==FNR est tout le temps faux, donc {ligne[$0]=1; next} n'est pas exécuté.

!ligne[$0] ça veut dire, en gros, si l'élément ligne[$0] n'existe pas. On aurait pu écrire aussi dans notre cas : ligne[$0] != 1
Par exemple, si "$A" contient :

$A a écrit :

tata
tete

Pour la première ligne, ligne["tata"] existe (créé lors de la lecture du fichier "$B") donc, on fait rien.
Pour la 2ème ligne, ligne["tete"] n'existe pas donc on l'affiche (s'il n'y a pas d'action définie entre accolades, c'est comme si on avait mis { print $0 })

Bon, d'accord, je suis pas certain que la commande awk soit plus simple, mais par contre, je pense qu'elle est bien plus rapide.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 08/01/2014, à 20:40

Arbiel

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Ok, maintenant je comprends. Merci pour tes explications.


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#6 Le 09/01/2014, à 16:11

tiramiseb

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Salut,

Plutôt que d'utiliser sed, utilise l'option "-x" de grep : elle demande de faire le grep sur la ligne complète (ça résulte donc en l'équivalent de ^ligne$).

grep -vxf fichier_lignes_à_supprimer fichier_à_exploiter

Dernière modification par tiramiseb (Le 09/01/2014, à 16:12)

Hors ligne

#7 Le 09/01/2014, à 23:58

Arbiel

Re : Extraction des lignes d'un fichier A sans équivalence dans fichier B

Ah oui, ça c'est bien mieux que ce que j'ai fait, et c'est facile à comprendre.

Merci tiramiseb


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne