对文件的子部分进行排序

时间:2015-06-03 12:38:36

标签: perl sorting

我需要那些比我更有经验的人的Perl智慧。

到目前为止,我对以下内容的回答是简单地逐行浏览文件,并将相关元素插入到数组中,对数组进行排序,然后附加内容。但这似乎有点啰嗦,而且效率不高。

我有一个文件,其内容如下所示:

Set objFSO = CreateObject("Scripting.FileSystemObject")
strFolder = objFSO.GetParentFolderName(WScript.ScriptFullName)

Perl中是否有一种聪明的方法(理想情况下可以通过管道进行单行程)来排序第二个列表?即所以你会得到以下结果:

# A Comment
# Another comment
:127.100.100.255:Something
.789
.123
.456
:127.200.200.100:Something Else
.bravo.example.com   # <----
noperiod.example.com # <----  This list is
.an.example.com      # <----  not ordered
.some.example.com    # <----

有四点需要注意:

  1. 要排序的内容始终位于文件的底部
  2. 标题(“:127.200.200.100等”)始终相同
  3. 名称可能会也可能不会以句点开头(例如.bravo.example.com vs noperiod.example.com)
  4. 可能会有大量项目,因此需要合理有效

2 个答案:

答案 0 :(得分:2)

取决于你的意思和效率&#39;。我的意思是,一个班轮很少高效,它也很少简洁或清楚它做了什么。

但就效率而言?嗯,这取决于你已经做的那些效率低下的事情。我的意思是,从根本上说,如果你要对某些东西进行排序,你需要检查整个数据集。否则你怎么知道文件中的最后一行需要排序到顶部?

但是对于你正在做的事情,我会这样做:

#!/usr/bin/perl
use strict;
use warnings;

sub sort_noperiods {
   my $a_np = $a;
      $a_np =~ s/\.//g;
   my $b_np = $b; 
      $b_np =~ s/\.//g; 

   return $a_np cmp $b_np;
}

while ( <> ) { 
   print;
   last if m/Something Else/;
}

print sort sort_noperiods <>;

对于您的样本输入,打印:

# A Comment
# Another comment
:127.100.100.255:Something
.789
.123
.456
:127.200.200.100:Something Else
.an.example.com      # <----  not ordered
.bravo.example.com   # <----
noperiod.example.com # <----  This list is
.some.example.com    # <----

我正在关注“其他东西”。你文件中的一行,因为我无法确定你如何识别标题的最后一行&#39;块。根据&#39; noperiods&#39;以及其他任何内容进行读入和排序。排序机制。 (通过缓存正则表达式的结果可能会有很小的效率提升,但我对此并不确定)。

这可以是单线化的&#39;由:

perl -e 'while ( <> ) { print; last if m/Something Else/ }; print sort { $a =~ s/\.//gr cmp $b =~ s/\.//gr } <>; '

答案 1 :(得分:1)

您可以通过shell在Perl的帮助下对其进行排序:只需在列表之前为每行添加行号,对于列表,使用其第一行的编号。然后按数字进行数字排序,然后按行的其余部分进行排序:

call FileTimeFilterJS.bat "." -filetime modified -direction after -dd -3