{或附近的语法错误}

时间:2016-04-15 13:24:52

标签: linux if-statement awk

我有一个分配,我必须计算每个.c .cc和.h文件中的单词数。问题是它一直显示第8行和第10行的语法错误{。这不是完成脚本!它可能有一些其他问题,但我只需要语法错误的帮助!

awk  'BEGIN {FS=" ";drb=0;valt=0;}
       {if ( valt == 0 ){
         for( i=1; i<=NF; i++)
             drb++;
         valt++; 
       }
       else{
         FNR==1{ printf "File name: %s,Word count: %d\n",FILENAME, drb;drb=0;}
         for(i=1;i<=NF;i++)
              drb++;}}
     END {printf "File name: %s,Word count: %d",FILENAME,drb }' `find $1 -name '*.c' -o -name '*.cc' -o -name '*.h'`  

2 个答案:

答案 0 :(得分:1)

我认为接受的答案是正确的。由于这是一个h / w问题,我将为您提供一个模板来理解和处理它

awk 'FNR==1{if(s) print f,s; s=0; f=FILENAME} {s+=NF} END{print f,s}' files

注意:您已经将NF作为循环条件使用它。 特殊处理是针对第一个文件,但也可以通过其他方式完成。

当然,您实际需要的内容已经实现为命令wc

wc -w files

将为您提供所需的结果,并根据您的格式需求输入awk

答案 1 :(得分:1)

在动作块中,awk条件语法类似于C,因此您需要:

if (FNR==1) { foo }

而不是

FNR==1 { foo }

但更重要的是,所有你需要的声音是:

awk  '
{ drb += NF }
ENDFILE { printf "File name: %s,Word count: %d",FILENAME,drb; drb=0 }
' files...

以上使用ENDFILE的GNU awk。请注意,即使对于空文件也是如此,对于使用其他awks的解决方案来说这是一个很大的问题(如果他们依赖于测试FNR==1而不是在ARGV[]部分的END上进行循环,他们将跳过该文件,而不是使用字数为零来打印它的名称。

使用非gawk awks(假设没有重复的文件名)执行此操作的正确方法是:

awk  '
{ drb[FILENAME] += NF }
END {
    for (i=1;i<ARGC;i++) {
        fname = ARGV[i]
        printf "File name: %s,Word count: %d",fname,drb[fname]
    }
}
' files...

如果你有重复的文件名,那么它实现起来就更难了,像这样(未经测试):

awk  '
FNR==1 { ++cnt[FILENAME] }
{ drb[FILENAME,cnt[FILENAME]] += NF }
END {
    delete cnt
    for (i=1;i<ARGC;i++) {
        fname = ARGV[i]
        printf "File name: %s,Word count: %d",fname,drb[fname,++cnt[fname]]
    }
}
' files...