Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subtructing n number of columns from two files with AWK

I have two files with N number of columns

File1:

A   1   2    3  .......  Na1
B   2   3    4  .......  Nb1

File2:

A   2   2    4  .......  Na2
B   1   3    4  .......  Nb2

i want a output where 1st column value from File1 will be subtracted from 1st column of File2, and this way till column N as shown below:

A  -1   0    -1  ........ (Na1-Na2)
B   1   0     0  ........ (Nb1-Nb2)

How to do this is AWK, or Perl scripting in Linux environment?

like image 388
Shumon Shumon Avatar asked Feb 24 '13 07:02

Shumon Shumon


1 Answers

This has already been answered, but I will add a one-liner. It uses paste, to concatenate the files, and awk to subtract:

paste file{1,2} | awk '{for (i=1;i<=NF/2;i++) printf "%s ", ($i==$i+0)?$i-$(i+NF/2):$i; print ""}'

Validation:

$ cat file1
A   1   2    3   4  5
B   2   3    4   5  6

$ cat file2
A   2   2    4 10 12 
B   1   3    4  3 5

$ paste file{1,2} | awk '{for (i=1;i<=NF/2;i++) printf "%s ", ($i==$i+0)?$i-$(i+NF/2):$i; print ""}'
A -1 0 -1 -6 -7 
B 1 0 0 2 1

It requires both files to have the same number of columns. Non-numeric columns should be at the same position. It prints the value in the first file if non-numeric, otherwise prints the difference.

like image 57
user000001 Avatar answered Sep 18 '22 15:09

user000001