我想在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中使用diff
,comm
,但它会逐行显示结果
答案 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