2011-02-27 60 views
0

我有两个文本文件,每个文本文件有几百行。其中一些行存在于两个文件中,我想删除这些行以使它们仅存在于其中一个文件中。基本上,我想减少它们以获得一组独特的线条。问题在于我无法对它们进行排序(它们是我的Chromium历史的精简版)。删除存在于另一个文件中的文本行

最简单的方法是什么?

我试过WinDiff,但那给了不正确的结果。我认为我可以在一段时间内敲一个PHP脚本,但希望有一个更简单的方法(最好是命令行工具)。

回答

0

那么,我最终写了一个PHP脚本。

我将两个文件读入一个字符串,然后使用\r\n作为分隔符将字符串分解为数组。然后,我遍历数组以删除存在的所有元素,最后将它们转储回文件。

唯一的问题是,通过尝试将剥离例程重构为函数,我发现通过引用传递被更改(元素删除)的数组导致它减慢到需要按Ctrl-C 'd,所以我只是通过价值传递并返回新的数组(违反直觉)。另外,使用unsetdelete the elements无论如何都很慢,所以我只是将元素设置为空字符串,并在转储过程中跳过了这些元素。

0

如果你有一个bash shell中(Cygwin的),下面的shell命令将删除出现在这两个文件从a.txt中的所有行:

comm -12 <(sort a.txt|uniq) <(sort b.txt|uniq) | while read dupe; do dupe_escaped=$(echo "$dupe" | sed 's/[][\.*^$/]/\\&/g'); sed -e "/${dupe_escaped}/d" -i a.txt; done 
+0

就像我说的,我不能排序,因为那时我失去访问URL的顺序,从而失去了所有的上下文。如果我可以排序,这将是**真的很容易。 – Synetech 2011-02-27 23:20:11

+0

排序只是创建一个重复的中间列表,然后用于从未排序的文件中过滤出重复项。 – codecraft 2011-02-27 23:23:31

+0

如果你想将两个文件合并成一个文件,你也可以使用AWK工具:'awk'!(a $){a [$ 0]; print}'a.txt b.txt' – codecraft 2011-02-27 23:29:23

相关问题