shell 从文件中删除不包含字符串的行

vatpfxk5  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(236)

给定一个包含如下字符串列表的文件:

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命令中列出它们。

x6492ojm

x6492ojm1#

这可能对你有用(GNU sed):

sed 's#.*#/^&/p#' file1 | sed -nf - -i file2

将file1转换为sed脚本并将其应用于file2。
第一个sed调用为每一行创建一个匹配字符串,如果成功,将打印该行。
第二个sed调用接受第一个调用的输出,并将其视为sed脚本。这个调用还设置了-n选项和-i选项,-n选项确保只打印匹配的行,而不打印其他行,-i选项在适当的位置编辑文件。

nxowjjhe

nxowjjhe2#

使用awk

awk 'NR==FNR{a[$0];next} ($1 in a)' File1.txt File2.txt
  • NR==FNR当您在第一个文件中时
  • a[$0]在数组a中注册行
  • next转到下一条记录
  • ($1 in a)如果$1您的第一个字段已在a中注册

awk中,如果你有一个条件为真,默认情况下它会打印该行,所以($1 in a)可以读作($1 in a){print $0}
使用此方法将确保您在第一个文件中有给定的文字输入。例如,如果你有AB.,这将只匹配AB.,而不会被认为是一个正则表达式,所以不会匹配ABy
这使用了一个关联数组,所以它将存储您在第一个文件中的每个值。如果此文件太大,您可能会遇到内存问题。
这不会编辑任何文件,因此您需要使用此方法将输出重定向到新文件。

qnyhuwrf

qnyhuwrf3#

如果文件包含正则表达式模式,如下所示:

^ABC
^DEF
^HIJ

那就简单了grep -f file1.txt file2.txt

相关问题