【问题标题】:awk script not workingawk 脚本不工作
【发布时间】:2015-10-09 21:00:03
【问题描述】:

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

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 的所有组件。

如果file1中没有的组件,我们必须忽略file2中的组件,以及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

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    这一行

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

    【讨论】:

    • 目前我在脚本中调用 /usr/bin/nawk -f rst.awk file1 file2,是否可以在脚本本身中写入 rst.awk 的内容?之后,每次天气 rst.awk 文件是否存在时,我都不必检查 rst.awk 文件。请帮助