文件比较中的awk代码

awk code in file comparision

两个文件,组件名称和版本号由 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

期望的输出:

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

需要的输出是:file1 中版本高于 file2 的所有组件,仅在第一个小数位。

所需的输出 "com.acc.invm:FNS_PROD" 即将到来,因为 96(在文件 1 中)> 95(在文件 2 中)

"com.acc.invm:FNS_TEST_DCCC_Mangment" 不会出现,因为 94.1.6(在文件 1 中)94.0.6(在文件 2 中),第一个十进制值相同 (94=94)。

尝试了 awk 代码,但没有成功。

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

欢迎提出任何建议。

根据您的说法(仅在第一个小数位),您不需要curr = a[1]*10000 + a[2]*100 + a[3]。用curr = a[1]就可以了。

由于您想要的输出只包含 file1 和 file2 中的行,因此需要 ( in prev) && (curr > prev[])

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

演示版

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(,a,/\./); curr = a[1];}
NR==FNR {prev[] = curr; next }
( in prev) && (curr > prev[])
awk '{ Version =  
       sub( /[.].*/, "", Version)
       if ( FNR == NR ) Versionning[ ] = Version
        else if( Versionning[ ] < Version) print
     }' file1 file2

您可以调整最后一个 if 以丢弃文件 1 中不存在的 line/product 并使用 Versionning [ ] != "" && Versionning[ ] < Version

更改条件