user2672739
user2672739

Reputation: 143

How to replace mismatch values in unix

I am comparing two files using unix Awk

col_1,col_2,col_3
1,2,4
1,3,6

col_1,col_3,col2,col_5,col_6
1,2,3,4,5
1,6,3,,,

Below is the code i am using

awk '
NR == FNR       {if (NR == 1)   for (MX=n=NF; n>0; n--) REF[$n] = n
                 else           TMP[NR] = $0
                 next
                }

FNR == 1        {for (n=NF; n>0; n--)   {if ($n in REF) CMP[n]=REF[$n]
                                         if ($n == SRCH) NSR = n
                                         HD[n]  = $n
                                         NL     = "Null"
                                        }
                 next
                }

                {n = split (TMP[FNR], IT)
                 EQU = 1
                 for (i=1; i<=MX; i++)  {T = IT[CMP[i]]
                                         if ($i != T)   {print SRCH, $NSR ": mismatch at", HD[i] ":", $i?$i:NL, "-", T?T:NL
                                                         EQU = 0
                                                        }
                                        }
                 if (EQU) print SRCH, $NSR, "doesn´t have any mismatch."
                }


' FS="," SRCH="col_1" file2 file1  # comparison files

I need to replace the mismatch records based on file2, can some one please guide

Upvotes: 0

Views: 55

Answers (1)

karakfa
karakfa

Reputation: 67507

awk to the rescue!

$ awk -F, -v OFS=, 'NR==1   {n1=split($0,cols1);h=$0;next} 
                    NR==FNR {a[$1]; next} 
                    FNR==1  {print h; n2=split($0,cols2); 
                             for(i=2;i<=n2;i++) cols[cols2[i]]=i; next} 
                    $1 in a {for(i=1;i<=n1;i++) 
                               printf "%s%s", 
                                      $(cols[cols1[i]]),(i==n1)?ORS:OFS}' file1 file2


col_1,col_2,col_3
1,3,2
1,3,6

your second file column header has a typo.

Upvotes: 1

Related Questions