从文件中删除特定匹配的行并转发到输出文件

时间:2016-02-21 19:04:39

标签: awk sed grep

Employee.txt包含以下内容:

Tom ID: 101
Bob ID: 102
Harry ID: 103
Martin ID: 106
Kevin ID: 109
Vicky ID: 108
Sam ID: 104

我需要删除ID为101,106,108的input.txt中的整行,并将结果输出到文件output.txt

我已在remove.txt中删除了要移除的ID。现在remove.txt有以下内容:

101
106
108

现在我应该得到如下输出:

Bob ID: 102
Harry ID: 103
Kevin ID: 109
Sam ID: 104

到目前为止,我已经这样做了,但似乎不正确,有人可以帮忙吗?

for i in `cat remove.txt`;do sed '/${i}/d' Employee.txt >> output.txt; done

3 个答案:

答案 0 :(得分:4)

使用GNU sed和bash' Process Substitution

sed -f <(sed 's|.*|/ &$/d|' remove.txt) Employee.txt 

输出:

Bob ID: 102
Harry ID: 103
Kevin ID: 109
Sam ID: 104

答案 1 :(得分:1)

$ awk 'NR==FNR{rmv[$0];next} !($NF in rmv)' remove.txt Employee.txt
Bob ID: 102
Harry ID: 103
Kevin ID: 109
Sam ID: 104

在末尾添加> output.txt以将输出重定向到文件,就像对任何其他UNIX命令一样。

答案 2 :(得分:0)

使用grep:

$ grep -vf remove.txt Employee.txt
Bob ID: 102
Harry ID: 103
Kevin ID: 109
Sam ID: 104

-f用于读取文件中的模式,-v用于反向匹配。使用

grep -vf remove.txt Employee.txt > output.txt

获取文件中的输出。

顺便说一下,为什么你的尝试不起作用有两个原因:

  1. 你的sed命令周围有单引号,所以sed试图与${i}字面匹配。您必须使用sed "/${i}/d"进行参数扩展。
  2. 即使您这样做,输出文件也会像

    Tom ID: 101
    Bob ID: 102
    Harry ID: 103
    Martin ID: 106
    Kevin ID: 109
    Vicky ID: 108
    Sam ID: 104
    Tom ID: 101
    Bob ID: 102
    Harry ID: 103
    Martin ID: 106
    Kevin ID: 109
    Vicky ID: 108
    Sam ID: 104
    Tom ID: 101
    Bob ID: 102
    Harry ID: 103
    Martin ID: 106
    Kevin ID: 109
    Vicky ID: 108
    Sam ID: 104
    

    因为sed在每次调用时都会遍历整个输入文件。