3

I have two files with thousands lines. I want to get their differences ratio in lines/bytes using diff, vimdiff or other commands, even regardless of the specific differences.

7

There's a tool called diffstat that sounds like what you're looking for.

$ diff <file1> <file2> | diffstat

Example

$ diff afpuri.c afpuri1.c | diffstat
 unknown |   53 ++++++++++++++++++++---------------------------------
 1 file changed, 20 insertions(+), 33 deletions(-)

This can be used for diff output which includes multiple files in a tree as well.

References

2

My math might be a bit off, but I beleive you asked for a ratio, and I beleive this produces a ratio.

#!/usr/bin/env bash
# File 1 contains 1,2,3,4,5 on new lines
# File 2 contains 1,2,3,4,5,6,7,8,9,10 on new lines.

# Compare differentials side-by-side
diff -y 1 2 > diff

# Print lines to file which do not contain ">" prefix.
sed 's/[ ]/d' diff > MATCHES

# Print lines to file which do contain ">" prefix.
sed '/[>]/!d' diff > DIFFS

# Count lines in file that contains MATCHES between Versions of Files 1,2.
MATCHES=`wc -l MATCHES | sed 's/[^0-9]*//g'`

# Count lines in file that DID NOT MATCH between Version of Files 1,2.
DIFFS=`wc -l DIFFS | sed 's/[^0-9]*//g'`

# Sed here is stripping all but the number of lines in file.

RATIO=`echo "$MATCHES / $DIFFS" | bc -l `

# To get the ratio, we are echoing the #of_matches and the #of_diffs to
# the bc -l command which will give us a float, if we need it.
echo "You've got:" $RATIO "differential."

# Bytes...
# stat -c%s prints bytes to variable
MATCHES=`stat -c%s MATCHES`
DIFFS=`stat -c%s DIFFS`

RATIO_BYTE=`echo "$MATCHES / $DIFFS" | bc -l `
echo "Let Ratio in Bytes be" $RATIO_BYTE
# Again, we divide the matches by the diffs to reach the "ratio" of
# differences between the files.
  • The accepted answer is good enough for ratio computing. Thanks anyway! – Nathaniel Ding Oct 6 '14 at 4:07
  • 2
    $> diffstat is definitely the shell utility for this. – Tyler Maginnis Oct 6 '14 at 4:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.