Thursday, October 27, 2022

[SOLVED] Finding difference of values between corresponding fields in two CSV files

Issue

I have been trying to find difference of values between corresponding fields in two CSV files

$ cat f1.csv
A,B,25,35,50
C,D,30,40,36
$
$ cat f2.csv
E,F,20,40,50
G,H,22,40,40
$

Desired output:

5 -5 0   
8 0 -4

I could able to achieve it like this:

$ paste -d "," f1.csv f2.csv
A,B,25,35,50,E,F,20,40,50
C,D,30,40,36,G,H,22,40,40
$
$ paste -d "," f1.csv f2.csv | awk -F, '{print $3-$8 " " $4-$9 " " $5-$10 }'
5 -5 0
8 0 -4
$

Is there any better way to achieve it with awk alone without paste command?


Solution

As first step replace only paste with awk:

awk -F ',' 'NR==FNR {file1[FNR]=$0; next} {print file1[FNR] FS $0}' f1.csv f2.csv

Output:

A,B,25,35,50,E,F,20,40,50
C,D,30,40,36,G,H,22,40,40

Then split file1[FNR] FS $0 to an array with , as field separator:

awk -F ',' 'NR==FNR {file1[FNR]=$0; next} {split(file1[FNR] FS $0, arr, FS); print arr[3]-arr[8], arr[4]-arr[9], arr[5]-arr[10]}' f1.csv f2.csv

Output:

5 -5 0
8 0 -4

From man awk:

FNR: The input record number in the current input file.

NR: The total number of input records seen so far.



Answered By - Cyrus
Answer Checked By - Senaida (WPSolving Volunteer)