1

このスクリプトを機能させて、タイプ .doc および .pdf のファイルの数を数えようとしています。しかし、for ループの最後のブラケットで構文エラーが発生し続けます。

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

awk スクリプトは次のとおりです。

#!/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
}
4

2 に答える 2

3

そのループ$7で変数名として使用することはできません。ブロック内のすべてをまたはそのようなものにfor変更$7します。ENDkey

于 2012-05-04T10:52:52.097 に答える
1

ワンライナーでこれを行うことができます:

[ghoti@pc ~]$ 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
[ghoti@pc ~]$ 

これにより、拡張機能の選択が awk スクリプトから出てfind、パイプの前のコマンドに移動することに注意してください。これをスタンドアロンの awk 専用スクリプト (シェルではなく) にしたい場合は、次のようにすることができると思います。

#!/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このコマンドはサブディレクトリもトラバースすることに注意してください。現在のディレクトリのみが必要な場合は、それぞれスワップインls *.pdf *.docおよび単に行うことができlsます。

于 2012-05-04T11:17:50.100 に答える