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

前言

用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容