嘗試做這種方式,假設你有之間的空行記錄如示例輸入中所示:
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值排序,然後反轉該過程。
我有10萬條記錄(樣品2您發佈重複50000次)定時該上的文件,一共只花了一下下7秒運行:
real 0m6.930s
user 0m6.722s
sys 0m0.388s
爲了幫助@Jotne看看會發生什麼時運行是在bash 4.1.11 Cygwin的腳本(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腳本的第二個版本打印以相反的順序記錄與期望無論是字母或數字排序。
請發佈您試過的代碼;有沒有錯誤,或者你需要簡單的優化? –
你想如何完成基於DTG的排序?例如,對於'20140109183524.013580787':如果該整數沒有點可以使用,比如'20140109183524013580787'然後做此值的數字升序排序? –