我正在尝试使用此脚本来计算.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
}
答案 0 :(得分:3)
您不能在$7
循环中使用for
作为变量名称。将$7
块中的所有END
更改为key
或类似内容。
答案 1 :(得分: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 *.doc
和ls
。