美文网首页
2022.5.29 perl 基础 | 统计文件行数的几种方法

2022.5.29 perl 基础 | 统计文件行数的几种方法

作者: 学生信的大叔 | 来源:发表于2022-05-29 23:06 被阅读0次

    前言

    用perl统计文件行数。

    这里是选择了之前推文中"Carya.fasta.p3in"文件 。

    重点小结

    这是对于我自己来说的重点。毕竟主要还是写给自己看,也就这么排版了。

    • 直接将文件读入数组,利用标量上下文统计行数
    • for 和while的循环读入每行后计数。对行数计数的标量,一定要定义到循环之前。
    • 调用linux命令wc -l 统计行数:用反引号 ` ` ;用system()或者exec() (涉及到父子进程,没系统学过linux,不是很理解其应用)。这种用法将结果直接赋值给标量,然后打印标量,不用接换行符也可自动换行。还有个问题,就是这部分脚本内容结束后无法再打印出来其它内容,也还不知道具体什么原因。

    单独总结下File::CountLines 模块

    从github上看,该包从2010年后没再维护。可能跟包的功能比较简单有关,作者觉得没必要再搞太多事。

    该包无法通过conda安装。

    我这里使用的是conda环境下的perl编译的,最后安装地址也是自动装到了conda下路径。

    git clone git://github.com/moritz/File-CountLines.git
    File-CountLines/
    perl Makefile.PL 
    make
    make install 
    
    • 调用File::CountLines : use File::CountLines qw(count_lines);
    • 基础用法
    use File::CountLines qw(count_lines);
    my $no_of_lines = count_lines('/etc/passwd'); #一般就不需要设置分割方式style,默认native。
    
    • 指定具体的换行符
    my $carriage_returns = count_lines( 
        'path/to/file.txt'  #文件
        style => 'cr',  #指定分割方式
      );
    # possible styles are 'native' (the default), 'cr', 'lf'
    # native 默认的style值,以"\n" 为换行符。大多数情况是没问题的。
    # cr 以回车作为行分隔符(MacOS风格)
    # lf 以换行符作为行分隔符(Unix风格)
    # crlf 以回车后跟换行符作为分隔符(Microsoft Windows风格)
    
    • “高级”用法

    可以指定任意分割符进行统计,个人理解就是设定了"$/"。但是这个用法,我尝试半天没写出来,暂时还不知道是什么问题。

    my $list = count_lines($life, separator => '\end{itemize}');
    

    脚本test.pl内容

    #!/usr/bin/env perl
    use strict;
    use warnings;
    #############################
    ## name:test.pl
    #############################
    print "## 标量上下文统计行数:\n";
    open P3IN,"<","Carya.fasta.p3in" || die;
    my @array=<P3IN>;
    my $line_index1 = @array;
    print "- 读入数组后标量上下文统计行数:$line_index1\n\n";
    
    print "## for 统计行数:\n";
    my $line_index2;
    foreach my $line (@array){
        $line_index2++;  
    }
    
    print "- for循环统计行数:$line_index2\n\n";
    close P3IN;
    
    ##################################
    print "## while 统计行数:\n";
    open P3IN,"<","Carya.fasta.p3in" || die;
    
    my $total_num; 
    while (<P3IN>){
        $total_num ++;
    }
    print "- while统计行数:$total_num\n\n";
    close P3IN;
    
    ################################
    use File::CountLines qw(count_lines);
    
    print "## File::CountLines 统计行数\n";
    my $nu_of_lines = count_lines('./Carya.fasta.p3in');
    print "- File::CountLines统计行数:$nu_of_lines\n\n";
    
    #my $lists = count_lines("Carya.fasta.p3in", separator => '\end{itemize}'); 
    #print "File::CountLines统计SSR涉及引物模块数:$lists\n\n";
    
    ################################
    print "## 调用linux系统命令统计行数\n";
    my $total = `wc -l Carya.fasta.p3in`;
    print $total; #直接换行?
    
    my $total2 = system("wc -l Carya.fasta.p3in");
    print $total2;#直接换行?
    
    my $total3 = exec("wc -l Carya.fasta.p3in");
    print $total3;#直接换行?
    
    ################################
    

    脚本运行及结果

    执行perl test.pl > test.md 得到的内容

    ## 标量上下文统计行数:
    - 读入数组后标量上下文统计行数:432
    
    ## for 统计行数:
    - for循环统计行数:432
    
    ## while 统计行数:
    - while统计行数:432
    
    ## File::CountLines 统计行数
    - File::CountLines统计行数:432
    
    ## 调用linux系统命令统计行数
    432 Carya.fasta.p3in
    432 Carya.fasta.p3in
    0432 Carya.fasta.p3in
    

    相关文章

      网友评论

          本文标题:2022.5.29 perl 基础 | 统计文件行数的几种方法

          本文链接:https://www.haomeiwen.com/subject/pkmnprtx.html