Javier2013
Javier2013

Reputation: 503

delete all lines from a file using string from another file with sed

I have a file1:

hello
world

And file2:

hello   A
hello   X
world   B
byebye  C

And I want to delete all lines that match the string in file1 from file2, to get this output:

byebye C

I am a beginner programming so I could only come up with this:

for i in {1..2}  
do  p=`sed -n ${i}p file1`  
sed '/$p\t\w/d' file2 > file2.tmp && mv file.tmp file2
done

Thanks for the help!

Upvotes: 0

Views: 49

Answers (3)

nu11p01n73R
nu11p01n73R

Reputation: 26667

Why didnt you code work

  • sed does not understand \w

    solution use -r flag for extended regex

  • '/$p\t\w/d' the variables are not expanded in single quotes

    solution use double quotes instead

Corrected

$for i in {1..2}  ; 
do 
p=`sed -n ${i}p file1`
sed -r "/$p\t\w/d" file2 > file2.tmp && mv file2.tmp file2
done
$ cat file2
byebye  C

This will provide output as

byebye  C

Note

Offcourse this provides the expected output, But there is always some other easy ways of accomplishing the task as in other answers

Upvotes: 1

Kalanidhi
Kalanidhi

Reputation: 5092

You can use this grep command

grep -vf  file1 file2 > file2

Your coding:

for i in {1..2}
do
p=`sed -n ${i}p file1`
sed -i "/^$p/d" file2
done

Upvotes: 2

anubhava
anubhava

Reputation: 784928

Using awk:

awk 'FNR==NR{a[$0];next} !($1 in a)' f1 f2
byebye  C

Using grep -vf

grep -vFf f1 f2
byebye  C

Upvotes: 3

Related Questions