使用此 awk 脚本时遇到问题

使用此 awk 脚本时遇到问题

我尝试使用以下行调用下面的脚本awk 'filecount'。它应该打印出文件信息和行号,然后打印目录中的文件总数,但什么也没发生。

这个脚本有什么问题?

#!/usr/bin/awk

BEGIN { 
    files=0;
}
{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}
END {
    print "Total Files:  ", files, "\n\n"
}

答案1

原始脚本存在问题

你的脚本有几个问题。首先,第一行应该是#!/usr/bin/awk -f。其次你说,

它应该打印出文件信息和行号

但是在您的脚本中,这部分计算行数而不是文件数,这也是多余的,因为 AWK 已经具有执行此操作的变量NRFNR

{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}

正确的工作方法

据我了解,您的主要要求是打印每个文件中的行数并打印当前目录中已处理的文件总数。这可以通过命令行上的 bash 轻松完成:

$ counter=0; for file in * ; do [ -f "$file" ] && [ -r "$file"  ] &&  { wc -l "$file"; counter=$(($counter+1)); }; done ; echo "Total files:" "$counter"
45 center_active_window.py
41 get_terminal.py
91 typescript
1 xprop.txt
17 xrandr_script.py
Total files: 5

如果您坚持使用 awk 执行此操作,那么也是可能的,但请注意 - 目录中的所有文件都应是常规文本文件并且可读。

以下是脚本及其示例运行:

$ cat ~/filecount.awk                                                                                                    
#!/usr/bin/awk -f

FNR==1{

    if (FNR!=NR){
        print counter,last_file;
    }
    filecounter++;
    last_file=ARGV[ARGIND];
    counter=0
};

{counter++};

END{
    print last_file,counter;    
    print "Files processed: ", filecounter;
}

$ ~/filecount.awk *  2> /dev/null                                                                                        
45 center_active_window.py
41 get_terminal.py
91 typescript
1 xprop.txt
xrandr_script.py 17
Files processed:  5

这里的想法很简单:

  • 每次文件中的行号 (FNR变量 ) 为 1 时,我们使用 ARGV 数组和 ARGIND 变量记录文件名。我们增加文件计数器,并将行号设置为 0;

  • 如果记录号与记录号不同在当前文件中,这意味着我们已经处理了至少一个文件,因此我们可以打印出有关它的信息。这就是该if (FNR!=NR){ . . .部分的作用

  • 本质上我们正在处理文件,然后回顾其信息。

  • 一旦我们浏览完所有文件,我们需要打印有关最后一个文件的信息(因为请记住,脚本通过向后查看所有项目来工作),然后打印总文件计数器。

相关内容