#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 :
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 :
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)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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