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コマンドが機能するはずです。両方の入力ファイルを提供する必要があります。失われたタイプはハッシュに保存され、キーをもう一方の 3 番目のフィールドと比較します。

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 に答える