Joe*_*Joe 7 grep text-processing
我有两个文件,让我们称他们123.txt和789.txt。123.txt是 2.5M 行长,789.txt是 65M 行长。有什么方法可以使用grep或类似的方法来保留789.txt包含以下行的任何行123.txt?
中每行最多有一个重复项789.txt,重复的文本将位于行首。我完全坚持这一点,在网上找不到任何信息,所以我真的没有什么可以开始的。它将在服务器上运行,所以我不介意它需要一段时间(我知道它会)
123.txt:
hxxp://www.a.com
hxxp://www.b.com
hxxp://www.c.com
Run Code Online (Sandbox Code Playgroud)789.txt:
hxxp://www.a.com/kgjdk-jgjg/
hxxp://www.b.com/gsjahk123/
hxxp://www.c.com/abc.txt
hxxp://www.d.com/sahgsj/
Run Code Online (Sandbox Code Playgroud)期望的输出:
hxxp://www.a.com/kgjdk-jgjg/
hxxp://www.b.com/gsjahk123/
hxxp://www.c.com/abc.txt
Run Code Online (Sandbox Code Playgroud)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,中间有一个空格。)