我有一个分配,我必须计算每个.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'`
答案 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...