linux文件比较

时间:2011-11-29 11:10:54

标签: linux unix filesystems

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

file1是:

ABC
B
KLM
JAH
MONU
PANDA

文件2是:

HELLO
PRETTI
ABC
B
LKMO

现在我想要的是明确区分文件1和文件2之间的区别而不是逐行的。(file1-file2),即文件1中的内容不在2中

差异文件:

KLM
JAH
MONU
PANDA

我尝试在Linux中使用diffcomm,但它会逐行显示结果

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

引用Wikipedia

  

Levenshtein距离也可以在两个更长的距离之间计算   字符串,但计算它的成本,大致成比例   两个弦长的乘积使得这不切实际。

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

答案 3 :(得分:0)

线条的显示顺序是否重要?如果订单无关紧要,这在awk中有一个非常优雅的解决方案:

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