2011-11-29 99 views
1

我想在Linux中比较两个文件,但比较不应该基于逐行比较,我想将结果转储到另一个文件。 例如:linux文件比较

文件1是:

ABC 
B 
KLM 
JAH 
MONU 
PANDA 

文件2:

HELLO 
PRETTI 
ABC 
B 
LKMO 

现在,我想要的是获取文件1之间的差异,并通过文件2内容明智的,而不是线(file1-file2)即文件1中的内容不在2中

区别文件:

KLM 
JAH 
MONU 
PANDA 

我试图与diffcomm在Linux,但它显示的结果通过逐行比较

+0

needleman-wunch算法会有什么用处? http://search.cpan.org/~vbar/Algorithm-NeedlemanWunsch-0.03/lib/Algorithm/NeedlemanWunsch.pm – Eamorr

+0

为了得到一个有价值的回应,你需要描述你想要使用的确切算法。看看你的例子,看起来你正在对空格进行标记,并忽略file2中没有出现在file1中的内容。但这只是一个猜测。 – kdgregory

+0

实际上文件的内容由换行符分隔,而不是由空格分隔。 – monucool

回答

0

我从你的exaple输出推断,要计算Levenshtein distance之间(也称为编辑距离)两个文件。

引用Wikipedia

的Levenshtein距离也可以两个较长 字符串,但计算它的成本,这是大致成正比 两个字符串的长度的乘积之间被计算,使得该不切实际。

那么你的文件有多大?你跟踪字符或单词吗?对于小文件(少量字符或文字,视情况而定),您可以编写自己的命令行Levenshtein距离工具。

+0

我正在跟踪单词,单词低于另一列,即排列在一列中 – monucool

5
sort file1.txt file2.txt file2.txt | uniq -u 

这个排序到位file1和两次文件2。当过滤唯一值,只发生在文件1的值只有FILE1.TXT允许重复相同的值将报告

,你可能想预处理,制定变薄有点复杂:

sort <(sort -u file1.txt) file2.txt file2.txt | uniq -u 
+0

这就是巧妙地使用排序和uniq你在那里! – Miquel

+0

你能解释一下为什么file2被重新排序两次。你可以解释一下内部发生了什么。 – monucool

+0

@monucool:它不只是排序两次,它是两次。这可以确保file2_中的所有行都不会被报告(因为它'发生'两次)。请注意,如果'file2.txt'包含10行,'sort file2.txt file2.txt'按定义返回20行,'sort file2.txt file2.txt | uniq -u'返回** 0行**根据定义 – sehe

0

线条出现的顺序是否重要?如果顺序并不重要,这在AWK一个非常优雅的解决方案:

awk 'BEGIN { 
    while((getline<"file2.txt")>0) { 
    eliminate[$0] = 1 
    } 
} 
!($0 in eliminate) { print }' file1.txt 
1

我很困惑,为什么不呢comm工作?

comm -23 <(sort file1) <(sort file2) 

使用您的示例文件,上面的生产:

JAH 
KLM 
MONU 
PANDA 

这也正是 “文件” 你想,模排序。现在如果你想让它们按file1的顺序排序,那就是另一回事了。我假设你的问题不具有被抑制的第二列,这就是你有你“由线对比线”,即:

$ comm -3 <(sort file1) <(sort file2) 
    HELLO 
JAH 
KLM 
    LKMO 
MONU 
PANDA 
    PRETTI 

在生产“差异文件”的事与原始排序:

$ comm -23 <(sort file1) <(sort file2)|grep -f - file1 
KLM 
JAH 
MONU 
PANDA 
+0

对于标准UNIX工具。 +1的'grep -f'技巧,我从来没有用过。具有很大的意义。 – sehe