Ana*_*ass 3 regex sorting perl grep
我有一个看起来像这样的文件:
text text text text : 6 min
text text text text : 2 min
text text text text : 8 min
text text text text : 2 min
Run Code Online (Sandbox Code Playgroud)
我需要对此文件进行排序以获得该输出:
text text text text : 2 min
text text text text : 2 min
text text text text : 6 min
text text text text : 8 min
Run Code Online (Sandbox Code Playgroud)
我试图这样做,但它不起作用:
my @copy = ();
open (INFILE, $ARGV[0]);
while (<INFILE>) {
push (@copy, $_);
}
my @lines = sort grep /^: (\d+) min/ , @copy;
print @lines;
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法在perl中执行此操作?
它更容易sort:
$ sort -t: -k2 file
text text text text : 2 min
text text text text : 2 min
text text text text : 6 min
text text text text : 8 min
Run Code Online (Sandbox Code Playgroud)
-t: 表示"将列的分隔符设置为:"-k2意思是"在第二列上过滤",即在第二列之后:.我可能会推荐sort首先发布的解决方案,因为它看起来最简单。但是,这是一个 perl 版本。它基于Schwartzian 变换。这不是必需的,但对于任何较大的文件,它可能是有效的,并且看起来有些整洁。
use strict;
use warnings;
my @lines = <>; # read the input file
@lines = map $_->[1],
sort { $a->[0] <=> $b->[0] }
map { my ($num) = /:\s*(\d+)/; [ $num, $_ ] } @lines;
print @lines;
Run Code Online (Sandbox Code Playgroud)
基本思想是这样的:
map提取数字的语句开始,返回对包含该数字的二元素数组的引用,以及原始行[ $num, $_ ]map语句结束,将我们的数组转换回原来的行。