I have a file containing words (one per line) such as


I have a secondary file in CSV format such as


I would like to use grep with the first file being the search pattern, if a line in the secondary file contains a word in the first file I would like to entirely remove the line in the secondary file.

I am not sure grep is even the way to go about this.

EDIT: bash scripting

  • sed or awk is what you want, not grep.
    – Zoredache
    May 10, 2013 at 18:43
  • How will you handle escaping issues in the csv? This could be a really complex set of regexs.
    – jpaugh
    May 10, 2013 at 21:17

1 Answer 1


You can do this using grep's -f option (that's lower-case -f, not -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

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv

Detailed explanation:

  • grep — self-explanatory
  • -v — means 'return lines not matching the input pattern'
  • -i — means 'use case-insensitive matching' (since your first file had capital letters and the CSV didn't)
  • -f — means 'interpret each line in the specified file (file1.txt) as a pattern to use for matching'

Depending on the results you want and the contents of your files, you may also want to read into the -F and -w options.

If you need to edit the file in-place, i think you can do this with sed's -f option, but sed interprets each line of the file as a command rather than a simple pattern like grep does.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.