Joining 2 Files

File "A" (column names: Nickname	Number	GB)
Nickname	Number	GB
PROD_DB0034	100A	16
ASMIL1B_DATA_003	100B	16
PSPROD_0000	1014	36
PSPROD_0001	100D	223
.....
File "B" (column names: TYPE    DEVICE NUMBER  SIZE)
TYPE    DEVICE NUMBER SIZE
1750500 hdisk2  100A    16384
1750500 hdisk3  1010    73728
1750500 hdisk5  1015    36864
1750500 hdisk4  1014    36864

I have two files above. On both files, "Number" (on A) and "NUMBER " (on B) are the join connector for these 2 file.

The output I want after the join is:

Nickname	Number	GB    TYPE    DEVICE NUMBER SIZE    REMARK
PROD_DB0034	100A	16    1750500 hdisk2  100A    16384
ASMIL1B_DATA_003	100B	16  -- -- -- --                       (no match)
-- -- -- --                         1750500 hdisk3  1010    73728   (no match)
PSPROD_0000	1014	36     1750500 hdisk4  1014    36864
-- -- -- --                          1750500 hdisk5  1015    36864  (no match)
PSPROD_0001	100D	223  -- -- -- --                              (no match)

Please advise.

Using awk:

awk '
  FNR==NR{F[toupper($2)]=$0; next}
  FNR==1{$0=$0"    REMARK"}
  $3 in F {print F[$3], $0; delete F[$3]; next}
  {print "-- -- -- --", $0, "(no match)"}
  END{ for (l in F) print F[l], "-- -- -- -- (no match)"}' fileA fileB
1 Like

Try

 
awk 'NR==1{s=$0}
 NR==FNR && NR>1{A[$2]=$0;next}
 FNR==1 && NR>1 {print s"\t"$0}
 FNR>1{if(A[$3]){print A[$3]"\t"$0;delete A[$3]}else{print "-- -- -- -- \t\t\t" $0 "(no match)"}}
 END{for(i in A){if(A){print A "\t -- -- -- -- "}}}' file1 file2
1 Like

why can't we use paste command

 paste $file1 $file2 

Thank you! It works perfect!