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
答案 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
获取文件中的输出。
顺便说一下,为什么你的尝试不起作用有两个原因:
${i}
字面匹配。您必须使用sed "/${i}/d"
进行参数扩展。即使您这样做,输出文件也会像
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在每次调用时都会遍历整个输入文件。