给定一个包含如下字符串列表的文件:
File1.txt
ABC
DEF
HIJ
和一个包含如下内容的文件:
文件2.txt
123 line
ABC line
HIJ line
456 line
786 line
如何从第二个文件中删除不以第一个文件中的字符串开始的行?此外,如果可能的话,我想在适当的地方编辑文件,而不是创建一个新的文件。
因此,生成的文件将包含:
ABC line
HIJ line
我在考虑用sed来删除像这样的行。
sed -n -e '/^ABC\|^DEF\|^HIJ/p' File2.txt
但是,File1.txt包含数千个要检查的字符串。最好使用单独的文件,而不是在这个sed命令中列出它们。
3条答案
按热度按时间x6492ojm1#
这可能对你有用(GNU sed):
将file1转换为sed脚本并将其应用于file2。
第一个sed调用为每一行创建一个匹配字符串,如果成功,将打印该行。
第二个sed调用接受第一个调用的输出,并将其视为sed脚本。这个调用还设置了
-n
选项和-i
选项,-n
选项确保只打印匹配的行,而不打印其他行,-i
选项在适当的位置编辑文件。nxowjjhe2#
使用
awk
:NR==FNR
当您在第一个文件中时a[$0]
在数组a
中注册行next
转到下一条记录($1 in a)
如果$1
您的第一个字段已在a
中注册在
awk
中,如果你有一个条件为真,默认情况下它会打印该行,所以($1 in a)
可以读作($1 in a){print $0}
使用此方法将确保您在第一个文件中有给定的文字输入。例如,如果你有
AB.
,这将只匹配AB.
,而不会被认为是一个正则表达式,所以不会匹配ABy
。这使用了一个关联数组,所以它将存储您在第一个文件中的每个值。如果此文件太大,您可能会遇到内存问题。
这不会编辑任何文件,因此您需要使用此方法将输出重定向到新文件。
qnyhuwrf3#
如果文件包含正则表达式模式,如下所示:
那就简单了
grep -f file1.txt file2.txt