Mac OS终端解决方案从另一个文本文件中删除文本文件行

时间:2016-12-27 09:40:49

标签: macos terminal

我在搜索引擎优化工作,有时我必须管理域名列表,以便我们的广告系列中的某些操作被考虑。在我的iMac上,我有2个列表,一个用于考虑 - unfiltered.txt - 另一个列出了我已经分析过的域名used.txt。提供考虑的那个,新的(unfiltered.txt),如下所示:

site1.com
site2.com
domain3.net
british.co.uk
england.org.uk
auckland.co.nz
... etc

需要用作过滤器的域名列表(used.txt) - 看起来像这样。

site4.org
site5.me
site6.co.nz
gland.org.uk
kland.co.nz
site7.de
site8.it
... etc

有没有办法使用我的OS X终端从unfiltered.txt中删除used.txt中找到的所有行?找到了一个部分解决问题的软件解决方案,除了来自used.txt的单词之外,还消除了包含这些较小单词的单词。这意味着我可以获得更广泛的过滤器并消除我仍然需要的域名。

例如,如果我的unfiltered.txt包含名为fogland.org.uk的域,则如果在我的used.txt文件中有一个名为gland.org.uk的域,则会自动删除该域。

文件非常大(接近10万行)。我有相当不错的配置,配备SSD,i7 7代,16GB内存,但不太可能只让它运行几个小时。

...希望它有意义。

TIA

4 个答案:

答案 0 :(得分:1)

您可以使用awk执行此操作。您将两个文件都传递给awk。解析第一个文件时,所有文件中的当前记录号与当前文件中的记录号相同,您可以记下您看到的每个域。然后,在解析第二个文件时,您只打印与您在第一个文件中没有看到的记录相对应的记录:

awk 'FNR==NR{seen[$0]++;next} !seen[$0]' used.txt unfiltered.txt 

输入数据的示例输出

site1.com
site2.com
domain3.net
british.co.uk
england.org.uk
auckland.co.nz

awk包含在内并作为macOS的一部分提供 - 无需安装任何内容。

答案 1 :(得分:0)

您可以使用comm。我没有在这里检查mac,但我希望它将默认安装。请注意,必须对两个文件进行排序。然后尝试:

comm -2 -3 unfiltered.txt used.txt

查看手册页以获取更多详细信息。

答案 2 :(得分:0)

我一直使用

grep -v -F -f expunge.txt filewith.txt > filewithout.txt

这样做。当“expunge.txt”太大时,您可以分阶段完成,将其切换为可管理的块并逐个过滤:

cp filewith.txt original.txt

and loop as required:
    grep -v -F -f chunkNNN.txt filewith.txt > filewithout.txt
    mv filewithout.txt filewith.txt

您甚至可以在管道中执行此操作:

 grep -v -F -f chunk01.txt original.txt |\
 grep -v -F -f chunk02.txt original.txt |\
 grep -v -F -f chunk03.txt original.txt \
 > purged.txt

答案 3 :(得分:0)

您可以使用comm并处理替换以在一行中执行所有操作:

comm -23 <(sort used.txt) <(sort unfiltered.txt) > used_new.txt

P.S。在运行OSX 10.11.6(El Capitan)的Mac上测试