Search code examples
awknawk

awk code in file comparision


two files which has component name and version number separated by a space:

cat file1
com.acc.invm:FNS_PROD 94.0.5
com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6
com.acc.invm:FNS_APIPlat_BDMap 100.0.9
com.acc.invm:SendEmail 29.6.113
com.acc.invm:SendSms 12.23.65

cat file2 
com.acc.invm:FNS_PROD 95.0.5
com.acc.invm:FNS_TEST_DCCC_Mangment 94.0.6
com.acc.invm:FNS_APIPlat_BDMap 100.0.10
com.acc.invm:SendEmail 29.60.113
com.acc.invm:SendSms 133.28.65
com.acc.invm:distri_cob 110

desired output :

com.acc.invm:FNS_PROD 95.0.5
com.acc.invm:SendSms 133.28.65

needed output is: All components from file1 with a higher version than in file2 in only in first decimal position.

in desired output "com.acc.invm:FNS_PROD" is coming because 96(in file1) > 95(in file2)

"com.acc.invm:FNS_TEST_DCCC_Mangment" is not coming because 94.1.6(in file1) 94.0.6 ( in file2), first decimal value is same (94=94).

tried awk code but no luck.

tst.awk
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[$1] = curr; next }
!($1 in prev) || (curr > prev[$1])
/usr/bin/nawk -f file2 file1 tst.awk

Any suggestion will be welcome.


Solution

  • According to your statement(only in first decimal position), you don't need the curr = a[1]*10000 + a[2]*100 + a[3]. Just use curr = a[1] would be fine.

    As your desired output only contain the line both in file1 and file2, so ($1 in prev) && (curr > prev[$1]) is needed.

    {split($2,a,/\./); curr = a[1];}
    NR==FNR {prev[$1] = curr; next }
    ($1 in prev) && (curr > prev[$1])
    

    DEMO

    lo@ubuntu:~$ cat f1
    com.acc.invm:FNS_PROD 94.0.5
    com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6
    com.acc.invm:FNS_APIPlat_BDMap 100.0.9
    com.acc.invm:SendEmail 29.6.113
    com.acc.invm:SendSms 12.23.65
    
    lo@ubuntu:~$ cat f2
    com.acc.invm:FNS_PROD 95.0.5
    com.acc.invm:FNS_TEST_DCCC_Mangment 94.0.6
    com.acc.invm:FNS_APIPlat_BDMap 100.0.10
    com.acc.invm:SendEmail 29.60.113
    com.acc.invm:SendSms 133.28.65
    com.acc.invm:distri_cob 110
    
    lo@ubuntu:~$ awk -f t.awk f1 f2
    com.acc.invm:FNS_PROD 95.0.5
    com.acc.invm:SendSms 133.28.65
    
    lo@ubuntu:~$ cat t.awk 
    {split($2,a,/\./); curr = a[1];}
    NR==FNR {prev[$1] = curr; next }
    ($1 in prev) && (curr > prev[$1])