awk脚本不工作

时间:2015-10-09 12:39:13

标签: bash awk

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

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 94.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

所需的输出是:file2中的所有组件都具有比file1更高的版本。

我们必须忽略file2中的组件(如果不在file1中),以及在file1中具有相同版本和较低版本的组件。

在此示例中,所需的输出是

com.acc.invm:FNS_APIPlat_BDMap 100.0.10
com.acc.invm:SendEmail 29.60.113
com.acc.invm:SendSms 133.28.65

尝试了这个awk代码但是从file2获取数据

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

输出:

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

1 个答案:

答案 0 :(得分:2)

这一行

(curr > prev[$1]) || !($1 in prev)

应改为

($1 in prev) && (curr > prev[$1])

由于你想忽略第二个文件中不在第一个文件中的项目,你的逻辑基本上是

if ($1 in prev) {
    if (curr > prev[$1]) {
        print
    }
}

if (x) if (y)相当于if (x && y)