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所有内容更改为或类似的内容。$7ENDkey

于 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-only 脚本(而不是 shell),我想你可以这样做:

#!/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 *.docls

于 2012-05-04T11:17:50.100 回答