用perl对行进行排序

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中执行此操作?

fed*_*qui 8

它更容易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意思是"在第二列上过滤",即在第二列之后:.


TLP*_*TLP 5

我可能会推荐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语句结束,将我们的数组转换回原来的行。