2

我有 2 个单独的文件 lostType.txt(显示所选选项)和 lost.txt(显示内存泄漏)我正在使用对话框创建 GUI。使用复选框,我从用户那里获取一些数字间隔来限制将被打印的内存泄漏。我要做的是,打印内存泄漏在选定大小的行,泄漏类型在 lostType.txt

例如,这是lost.txt

LEAK SUMMARY
100 bytes definitely lost
0 bytes indirectly lost
0 bytes possibly lost
100 bytes still reachable
0 bytes suppressed

如果用户想看到明确丢失和间接丢失,lostType.txt有以下

definetely
indirectly

假设用户选择查看泄漏,其中大小介于 0 和 10 字节或 100 和 250 字节之间。现在输出必须是100 bytes in 1 blocks definitely lost

到目前为止我所做的是以下,

for choice in $choices
do
    case $choice in
    1)
        #"Memory Leak <= 10 Byte"
        cat lost.txt | awk '{
            if ($1 <= 10 && $1 > 0 )
                print $1,$2" ==>",$3,$4     
            }'
        ;;

    2)
        #"10 Byte < Memory Leak <= 50 Byte"
        cat lost.txt | awk '{
            if ($1 <= 50 && $1 > 10 )
                print $1,$2" ==>",$3,$4     
            }'
        ;;

也就是说,根据选择的大小间隔,我可以打印这些值。但是,我找不到查找 lostType 的方法(上层代码 3 美元)。我需要做的是在 awk 中搜索文件,例如

cat lost.txt | awk '{
 if ($1 <= 50 && $1 > 10 AND IF $3 IS IN lostType.txt)
      print $1,$2" ==>",$3,$4   
 }'
;;

所以我的问题是,如何在 awk 中搜索文件?

4

1 回答 1

1

如果我理解您的问题,以下awk命令应该可以工作。您必须提供两个输入文件。丢失的类型保存在散列中,并将键与另一个的第三个字段进行比较。

awk '
    FNR == NR { type[ $1 ] = 1; next } 
    $1 > 10 && $1 < 200 && type[ $3 ] { print $1,$2 " ==> " $3,$4 }
' lostType.txt lost.txt

但是这样你就可以解析每个case选项。在我看来,将这些变量传递给awk命令并只运行一次应该是一个更好的解决方案。

case $choice in
1)
    limit_inf=0
    limit_sup=10
    break
    ;;
2)
    limit_inf=10
    limit_sup=50
    break
    ;;
...

接着:

awk -v li="$limit_inf" -v ls="$limit_sup" '
    FNR == NR { type[ $1 ] = 1; next } 
    $1 > li && $1 < ls && type[ $3 ] { print $1,$2 " ==> " $3,$4 }
' lostType.txt lost.txt
于 2013-05-30T07:48:09.893 回答