Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am looking to compare two text files. Normally, I can just use diff to compare the two files to see the differences. This is great, except that I am more concerned with the percentage difference of the two files.

For example:

File A:

File B:

In this case, the result would be a 50% difference. I've taken a look at wdiff, and it mostly works, with the exception being that it looks at elements word-by-word (in fact, I can get the result above by doing wdiff -s filea fileb).

Does a tool exist to provide file percentage difference on a by character/ by byte level?

share|improve this question

Doing a character-by-character comparison of two text files is effectively a Levenshtein distance calculation. There isn't a common standalone program in Linux that will do this calculation, but there are some library functions (I know PHP has one) and tons of example code online for this calculation.

One other little caveat is that Levenshtein distance is strictly the number of changes between two strings, so if you're looking for a percentage, you'll need to normalize the calculated distance. Dividing by the mean of the lengths of the two strings (sizes of the text files) is a widely-used normalization.

share|improve this answer

Try piping the output if diff to the wc command. There are several options but -l will likely give you a decent count of the number of changed lines. Since diff outputs before & after lines along with some other formatting you may have to divide the result by that factor and then place that over the the result of the entire file length in lines. wc -l

share|improve this answer
diff -u 0 removes context – Lazy Badger Oct 18 '11 at 15:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .