Question Utiliser grep pour supprimer des lignes d'un fichier contenant une chaîne d'un autre fichier


J'ai un fichier contenant des mots (un par ligne) tel que

Chien
 Poisson
 Chat
 Chaussures

J'ai un fichier secondaire au format CSV tel que

1, chaussures, rouge
 2, pomme, noir
 3, brouillard, bleu

Je voudrais utiliser grep avec le premier fichier étant le modèle de recherche, si une ligne dans le fichier secondaire contient un mot dans le premier fichier, je voudrais supprimer entièrement la ligne dans le fichier secondaire.

Je ne suis pas sûr que grep soit la solution pour y parvenir.

MODIFIER: script bash


4
2018-05-10 18:40


origine


sed ou awk est ce que vous voulez, pas grep. - Zoredache
Comment allez-vous gérer les problèmes de fuite dans le csv? Cela pourrait être un ensemble vraiment complexe de regex. - jpaugh


Réponses:


Vous pouvez le faire en utilisant grep's -f option (c'est minuscule -f, ne pas -F):

% echo -e 'Dog\nFish\nCat\nShoes' > ./file1.txt 
% echo -e '1,shoes,red\n2,apple,black\n3,fog,blue' > ./file2.csv 

# Grab all lines from the CSV that match a pattern from file1:
% grep -if ./file1.txt ./file2.csv
1,shoes,red

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv
2,apple,black
3,fog,blue

Explication détaillée:

  • grep - explicite
  • -v - signifie «lignes de retour ne correspondant pas au modèle d'entrée»
  • -i - signifie «utiliser la correspondance insensible à la casse» (puisque votre premier fichier avait des lettres majuscules et que le fichier CSV ne l'était pas)
  • -f - signifie 'interpréter chaque ligne du fichier spécifié (file1.txt) comme modèle à utiliser pour l'appariement '

Selon les résultats souhaités et le contenu de vos fichiers, vous pouvez également vouloir lire dans le -F et -w options

Si vous devez modifier le fichier sur place, je pense que vous pouvez le faire avec sed's -f option, mais sed interprète chaque ligne du fichier comme une commande plutôt qu'un simple modèle comme grep Est-ce que.


9
2018-05-10 19:51