我如何修改我的awk脚本,以便使用文本文件作为输入打印匹配的正确值?

时间:2018-04-16 05:46:08

标签: awk

我有一些文本文件,其中包含“sr”和“dr”格式的读者 - 作者锁的输出,它们是“start read”和“done read”以及“sw”和“dw”的缩写“这是”开始写“和”完成写“的缩写。

基本上,我试图记录当前读者的数量和当前作者的数量。例如,当前作者的数量将在'sw'行上增加,在'dw'行上减少。

例如,我的第一个文本文件包含以下内容:

sr
sw
dw
dr

所以,那个输出应该是:

$ awk -f check-rwlock.awk test1.txt
maxr = 1, maxw = 1
reader/writer test: FAIL    
writer/writer test: PASS

因为读取器和写入器操作之间存在重叠,所以测试“FAILED”,而写入器操作之间没有重叠,因此测试“PASSED”。

这是我写的awk脚本:

/sr/{
    read_count++
}
/sw/{
    write_count++
}
END{
    print "maxr = " read_count", " "maxw = " write_count
}

我怎样才能进一步修改我的脚本,以便通过读写器和编写器/编写器的测试获得我想要的输出?

1 个答案:

答案 0 :(得分:1)

解决方案:

/^sr/ {
    cr++
    mxr = cr>mxr ? cr : mxr
} 
/^sw/ {
    cw++
    mxw = cw>mxw ? cw : mxw
} 
/^dr/ { cr-- } 
/^dw/ { cw-- }
cr && cw { rwf=1 }
cw>1 { wwf=1 }
END {
    print "maxr = " mxr ", maxw = " mxw
    print "reader/writer test: " (rwf ? "FAIL" : "PASS")
    print "writer/writer test: " (wwf ? "FAIL" : "PASS")
}

示例输入:

sr
dr
sw
dw
sr
sw
sw
dr
dw
dw

示例输出:

maxr = 1, maxw = 2
reader/writer test: FAIL
writer/writer test: FAIL

请注意,您的脚本不计算最大并发操作数,它只计算所有已启动的操作。因此我的输入结果不正确。