文件比较中的awk代码

时间:2015-10-12 09:47:01

标签: awk nawk

两个文件,其组件名称和版本号用空格分隔:

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(在file1中)> 95(在文件2中)

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

尝试了awk代码,但没有运气。

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

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

根据您的陈述(仅在第一个小数位),您不需要curr = a[1]*10000 + a[2]*100 + a[3]。只需使用curr = a[1]即可。

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

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

<强>样本

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])

答案 1 :(得分:1)

awk '{ Version = $2 
       sub( /[.].*/, "", Version)
       if ( FNR == NR ) Versionning[ $1] = Version
        else if( Versionning[ $1] < Version) print
     }' file1 file2

您可以调整最后的 if 以丢弃文件1中的非现有行/产品,并使用Versionning [ $1] != "" && Versionning[ $1] < Version更改条件