Bash - 从一个文件中删除行,同时迭代另一个文件中的行

时间:2017-01-25 14:05:56

标签: linux bash shell unix sed

我有两个文件。

file.txtdelete.txt

file.txt包含以下内容:

/somedirectory/
/somedirectory2/somefile.txt
/anotherfile.txt

delete.txt包含:

/somedirectory/
/somedirectory2/somefile.txt

我需要删除file.txt

中包含的delete.txt

cat file.txt的结果应为:

/anotherfile.txt

到目前为止,我已经尝试过这个没有运气了:

while read p; do
    line=$p;
    sed -i '/${line}/d' file.txt;
done < delete.txt

我没有收到任何错误,它只是没有编辑我的file.txt文件。我用echo ${line}测试了while循环,它在该场景中按预期工作。

有什么建议吗?

注意:即使我从文件中删除正斜杠,上面的while循环也不会按预期工作。

4 个答案:

答案 0 :(得分:5)

使用简单的grep

grep -vFxf  delete.txt file.txt > temp.txt && mv temp.txt file.txt 

答案 1 :(得分:3)

使用awk

awk 'NR==FNR {a[$0]=1; next}; !a[$0]' delete.txt file.txt
  • NR==FNR {a[$0]=1; next}仅针对delete.txt文件(第一个文件参数)执行;关联数组a将记录作为键,1作为每个键的值

  • !a[$0]针对第二个文件参数执行,即file.txt;打印(默认操作)数组a中不存在的记录作为键

示例:

% cat delete.txt 
/somedirectory/
/somedirectory2/somefile.txt

% cat file.txt
/somedirectory/
/somedirectory2/somefile.txt
/anotherfile.txt

% awk 'NR==FNR {a[$0]=1; next}; !a[$0]' delete.txt file.txt
/anotherfile.txt

答案 2 :(得分:3)

单引号内的$ {line}不会扩展,因此它会在file.txt中查找实际字符串$ {line}。将它放入您的示例文件中以查看它是否被删除。

但是,您仍然会遇到问题,因为删除文本中的斜杠将被sed解释,因此正则表达式不会被正确分隔。为了使用sed,你必须跳过一些箍来让输入行中的每个字符正确引用为文字。

答案 3 :(得分:1)

改为使用comm

comm -23 file.txt delete.txt

但是必须对输入文件进行排序。如果他们不是:

comm -23 <(sort file.txt) <(sort delete.txt)