如果其中一部分出现在另一个文件中,则从一个文件中打印行。这两个文件都有数百万行长

Joe*_*Joe 7 grep text-processing

我有两个文件,让我们称他们123.txt789.txt123.txt是 2.5M 行长,789.txt是 65M 行长。有什么方法可以使用grep或类似的方法来保留789.txt包含以下行的任何行123.txt?

中每行最多有一个重复项789.txt,重复的文本将位于行首。我完全坚持这一点,在网上找不到任何信息,所以我真的没有什么可以开始的。它将在服务器上运行,所以我不介意它需要一段时间(我知道它会)

ter*_*don 13

您可以使用grep以下方法轻松完成此操作:

$ grep -Ff 123.txt 789.txt
http://www.a.com/kgjdk-jgjg/ 
http://www.b.com/gsjahk123/ 
http://www.c.com/abc.txt 
Run Code Online (Sandbox Code Playgroud)

上面的命令将打印文件789.txt中包含123.txt. -f 表示“从该文件中读取要搜索的模式”,-F 告诉 grep 将搜索模式视为字符串而不是其默认的正则表达式。

如果行123.txt包含尾随空格,这将不起作用,grep将空格视为模式的一部分以查找如果它出现在单词中将不匹配。例如,模式foo (注意尾随空格)将不匹配foobar。要从文件中删除尾随空格,请运行以下命令:

$ sed 's/ *$//' 123.txt > new_file
Run Code Online (Sandbox Code Playgroud)

然后使用new_file到grep:

$ grep -Ff new_file 789.txt
Run Code Online (Sandbox Code Playgroud)

您也可以在没有新文件的情况下使用以下i标志执行此操作:

$ sed -i.bak 's/ *$//' 123.txt
Run Code Online (Sandbox Code Playgroud)

这将更改文件123.txt并保留一份名为123.txt.bak.

(请注意,这种形式的-i标志sed假设您有 GNU sed; 对于 BSDsed使用-i .bak,中间有一个空格。)

  • @约瑟夫R。你完全正确,我的错。我删除了那个建议。谢谢你指出。 (3认同)