假设您的记录之间有一个空白行,如示例输入所示:
awk -v RS= '{gsub(/a/,"aA"); gsub(/\n/,"aB"); print $5, $0}' file |
sort |
awk -v ORS='\n\n' '{sub(/[^ ]+ /,""); gsub(/aB/,"\n"); gsub(/aA/,"a")}1'
上面通过将所有“a”转换为“aA”,然后将“\n”转换为“aB”,将每条记录压缩到一行(所以稍后在输入中转换回“aB”时您会知道只能来自第二个 gsub(),因为所有原始“aB”都已由第一个 gsub()) 转换为“aAB”,在 DTG 值之前添加,对其进行排序,然后反转该过程。
我对一个有 100,000 条记录的文件进行了计时(您发布的示例 2 重复了 50,000 次),运行时间不到 7 秒:
real 0m6.930s
user 0m6.722s
sys 0m0.388s
为了帮助@Jotne 了解在 cygwin 上使用 bash 4.1.11(2)、perl 5.14.4 运行脚本时会发生什么,这对我来说是脚本的 2 个版本,第二个版本是修改后的 print 语句:
$ cat file
# Pri: Rest, DTG: 20140109183524.013578591, CID: 1004592976
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
# Pri: Rest, DTG: 20140109183524.013580787, CID: 1004592977
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
Option1:34
Option5:98
#
$ printf "20140109183524.013580787\n20140109183524.013578591\n" | sort
20140109183524.013578591
20140109183524.013580787
$ printf "20140109183524.013580787\n20140109183524.013578591\n" | sort -n
20140109183524.013578591
20140109183524.013580787
#
$ cat script1.pl
#!/usr/bin/perl -w
use strict;
my $dtg;
my %data;
while (<>) {
if (/^#.*?DTG: ([\d.]+)/) {
$dtg = $+;
}
$data{$dtg} .= $_;
}
print @data{sort keys %data};
#
$ cat script2.pl
#!/usr/bin/perl -w
use strict;
my $dtg;
my %data;
while (<>) {
if (/^#.*?DTG: ([\d.]+)/) {
$dtg = $+;
}
$data{$dtg} .= $_;
}
print @data{sort { $a <=> $b } keys %data};
#
$ perl script1.pl < file
# Pri: Rest, DTG: 20140109183524.013578591, CID: 1004592976
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
# Pri: Rest, DTG: 20140109183524.013580787, CID: 1004592977
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
Option1:34
Option5:98
#
$ perl script2.pl < file
# Pri: Rest, DTG: 20140109183524.013580787, CID: 1004592977
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
Option1:34
Option5:98
# Pri: Rest, DTG: 20140109183524.013578591, CID: 1004592976
dn: op=applV,uid=2256c1e8-1166-46e4-a3a9-9fbe27694e12,Name=sub,loc=Ph,o=s,o=s.com
action: add
Class: c-subSpecData
Option3: applView
Option2: 3
如您所见,perl 脚本的第二个版本以与期望相反的顺序打印记录,无论是字母排序还是数字排序。