4
votes

I have 2 text files and I need to export "changes" to a new file. That means that the second file's rows are compared to the first file's rows and if a row isn't found there, then it will append it to the new (third) file.

Contents of the first file are:

ABC 123 q1w2sd
DEF 321 sdajkn
GHI 123 jsdnaj
JKL 456 jsd223

The second file contains:

ABC 123 XXXXXX
JKL 456 jsd223
DEF XXX sdajkn
GHI 123 jsdnaj

Notice that lines which start with ABC and DEF have changed. JKL has just changed it's place.

The output file should contain: ABC 123 XXXXXX DEF XXX sdajkn

How to do this using 'awk' or 'sed'?

Edit: Also new lines in the second file should be counted as changes..

4

4 Answers

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

With grep: grep -Fvxf file1 file2

3
votes

Assuming 1st file is named: fileA and 2nd file is named: fileB you can use awk like this:

awk 'NR==FNR {a[$1];b[$0];next} ($1 in a) && !($0 in b)' file{A,B}

OR simply:

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

Code for GNU :

$sed 's#\(.*\)#/\1/d#' file1|sed -f - file2
ABC 123 XXXXXX
DEF XXX sdajkn

This also treats "newlines" in file2.

0
votes

Using comm to find lines in 2nd file that are not in 1st:

$ comm -13 <(sort first) <(sort second)
ABC 123 XXXXXX
DEF XXX sdajkn