2012-05-04 4 views
1

このスクリプトを使用して、.docおよび.pdfタイプのファイル数を数えようとしています。しかし、私はforループの最後の括弧で構文エラーを取得し続けます。あなたはそのforループ内の変数名として$7使用することはできませんAWKスクリプトがforループでエラーをスローする

#!/usr/bin/awk -f 
BEGIN {} 
{ 
    file = match($7, "/datasheets/") 
    doccheck = match(tolower($7), ".doc") 
    pdfcheck = match(tolower($7), ".pdf") 
    if(doccheck || pdfcheck) 
    { 
      count[$7]++ 
    } 
} 
    END{ 

    for ($7 in count) 
    { 
      frequency = count[$7] 
      sub(/datasheets/,"",$7) 
      minusextension = $7 
      sub(/\....$/, "", minusextension) 
      print minusextension, $7, frequency 
    } 
    sort 
} 

答えて

3

awk: ./parselog.awk:14:  for ($7 in count) 
awk: ./parselog.awk:14:     ^syntax error 

ここではawkスクリプトです。 ENDブロックの$7keyなどに変更してください。

+0

もちろん、変数名として '$ 7'を使うことができます。それはちょうどいい考えではないし、それを取り巻く混乱があなたのコードを破る可能性が高い。これを試してください: 'printf 'one \ ntwo \ nthree \ n' | awk '1 END {$ 3 = "foo"; $ 3を印刷します。 } '' – ghoti

+1

'awk 'END {a [1] = 0; for($ 1 in){}} ''=>構文エラー。 'awk 'END {a [1] = 0; for(b in a){}} ''構文エラーはありません。 – Mat

+0

ああ、ちょうどforループです。面白い。私は-1を取り戻す。 – ghoti

1

あなたはワンライナーでこれを行うことができます。これは、awkスクリプトのうち、以前のパイプでfindコマンドへの拡張機能の選択を移動する

[[email protected] ~]$ find . \(-name "*.doc" -or -name "*.pdf" \) -print | awk -F. '{c[$NF]++} END {for(ext in c){printf("%5.0f\t%s\n", c[ext], ext);}}' 
    232 pdf 
    45 doc 
[[email protected] ~]$ 

注意。

#!/usr/bin/awk -f 

BEGIN { 

    # List of extensions we're interested in: 
    exts["doc"]=1; 
    exts["pdf"]=1; 

    FS="."; 
    cmd="find . -print"; 
    while (cmd | getline) { 
    if (exts[$NF]==1) { 
     c[$NF]++; 
    } 
    } 
    for (ext in c) { 
    printf("%5.0f\t%s\n", c[ext], ext); 
    } 
    exit; 
} 

findコマンドはまた、サブディレクトリを横断する注意:あなたが本当にこのスタンドアロンAWK-のみのスクリプト作成(およびシェルではない)にしたい場合は、私はあなたがこのようにそれを行う可能性があるとします。現在のディレクトリのみが必要な場合は、ls *.pdf *.docとそれぞれlsでスワップできます。

関連する問題