使用sed从另一个文件中删除字符串中的所有行

时间:2014-12-10 12:01:05

标签: bash shell sed

我有一个文件1:

hello
world

和file2:

hello   A
hello   X
world   B
byebye  C

我想从file2中删除与file1中的字符串匹配的所有行,以获得此输出:

byebye C

我是初学者编程所以我只想出这个:

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

使用awk:

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

使用grep -vf

grep -vFf f1 f2
byebye  C

答案 1 :(得分:2)

您可以使用此grep命令

grep -vf  file1 file2 > file2

您的编码:

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

答案 2 :(得分:1)

为什么你没有代码工作

  • sed无法理解\w

    解决方案使用-r标记扩展正则表达式

  • '/$p\t\w/d'变量未在单引号中展开

    解决方案使用双引号代替

<强>校正的

$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

这将提供输出

byebye  C

注意

Offcourse这提供了预期的输出,但总有一些其他简单的方法来完成任务,如在其他答案中