How to Get the Difference (Only Additions) Between Two Files in Linux

How to get the difference (only additions) between two files in linux

diff and then grep for the edit type you want.

diff -u A1 A2 | grep -E "^\+"

Diff to get changed line from second file

If you don't need to preserve the order, you could use the comm command like:

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

comm compares 2 sorted files and will print 3 columns of output. First is the lines unique to file1, then lines unique to file2 then lines common to both. You can supress any columns, so we turn of 1 and 3 in this example with -13 so we will see only lines unique to the second file.

or you could use grep:

grep -wvFf file1 file2

Here we use -f to have grep get its patterns from file1. We then tell it to treat them as fixed strings with -F instead of as patterns, match whole words with -w, and print only lines with no matches with -v

Fastest way of finding differences between two files in unix?

You could try..

comm -13 <(sort file1) <(sort file2) > file3

or

grep -Fxvf file1 file2 > file3

or

diff file1 file2 | grep "<" | sed 's/^<//g'  > file3

or

join -v 2 <(sort file1) <(sort file2) > file3

diff command to get number of different lines only

Yes you can, and in true Linux fashion you can use a number of commands piped together to perform the task.

First you need to use the diff command, to get the differences in the files.

diff file1 file2

This will give you an output of a list of changes. The ones your interested in are the lines prefixed with a '>' symbol

You use the grep tool to filter these out as follows

diff file1 file2 | grep "^>"

finally, once you have a list of the changes your interested in, you simply use the wc command in line mode to count the number of changes.

diff file1 file2 | grep "^>" | wc -l

and you have a perfect example of the philosophy that Linux is all about.

Compare two files and append the differences at the end

I think you can solve this problem by using diff -U <large number>. This will give you output that will be easy to parse to reconstruct what you want. If <large number> is larger than the longer of your two files, then you will get a predictable output format:

$diff -u 1000 file1 file2
--- file1 2019-07-22 14:39:39.344674000 -0400
+++ file2 2019-07-22 14:39:45.072654000 -0400
@@ -1,4 +1,4 @@
A
+B
C
-D
E

Then you can use grep and sed to reconstruct the two output files you want:

diff -u 1000 file1 file2 | sed '1,3d' > tmp
grep '^ ' tmp | sed 's/^ //' > file1.out
cp file1.out file2.out
grep '^-' tmp | sed 's/^-//' >> file1.out
grep '^+' tmp | sed 's/^+//' >> file2.out

Notes:

  • sed '1,3d' just deletes the first three lines of the diff output, since they're not contents. I previously had tail +3 here but that is not so portable; sed is safer.
  • The first grep extracts lines in common (start with a space in the diff).
  • The next two greps extract lines not in common (- means in file1 only, + in file2 only).
  • If file1 and file2 are identical, this will yield empty output files.

How to display only different rows using diff (bash)

a.txt:

1;john;125;3
1;tom;56;2
2;jack;10;5

b.txt:

1;john;125;3
1;tom;58;2
2;jack;10;5

Use comm:

comm -13 a.txt b.txt 
1;tom;58;2

The command line options to comm are pretty straight-forward:

-1 suppress column 1 (lines unique to FILE1)

-2 suppress column 2 (lines unique to FILE2)

-3 suppress column 3 (lines that appear in both files)

emailing diff output between two files only if there is a difference

Use the || concatenation.

diff -q file1 file2 || diff file1 file2 | mail -s "subject" "email@email.com"

More info here

Comparing two files in linux terminal

Here is my solution for this :

mkdir temp
mkdir results
cp /usr/share/dict/american-english ~/temp/american-english-dictionary
cp /usr/share/dict/british-english ~/temp/british-english-dictionary
cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary
cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary
grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english
grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english
grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english

Compare two files line by line and generate the difference in another file

diff(1) is not the answer, but comm(1) is.

NAME
comm - compare two sorted files line by line

SYNOPSIS
comm [OPTION]... FILE1 FILE2

...

-1 suppress lines unique to FILE1

-2 suppress lines unique to FILE2

-3 suppress lines that appear in both files

So

comm -2 -3 file1 file2 > file3

The input files must be sorted. If they are not, sort them first. This can be done with a temporary file, or...

comm -2 -3 <(sort file1) <(sort file2) > file3

provided that your shell supports process substitution (bash does).

Copy differences between two files in unix

Another way to get diff is by using awk:

awk 'FNR==NR{a[$0];next}!($0 in a)' file1 file2

Though I must admit that I haven't run any benchmarks and can't say which is the fastest solution.



Related Topics



Leave a reply



Submit