在論文「理論與實踐的建設工作排序例程」,JP林德曼表明,最好的方式來獲得良好表現出來的系統sort
命令(這是'他正在處理的'排序例程')與複雜的鍵是創建命令來生成密鑰,使比較簡單。在該示例中,與複雜的密鑰的排序命令是:
sort -t' ' -k 9,9.2 -k3 -k17
的替代機制中使用的密鑰生成器,可以很容易進行排序:
keygen | sort | keystrip
和密鑰發生器是:
awk -F' ' '{printf "%s:%s:%s:%s\n", substr($9, 1, 2), $3, $17, $0}'
和重點提器:
awk -F':' {printf "%s\n", $4}'
對於Lindeman正在處理的測試數據,這會將經過的時間從精細排序命令的大約2100秒減少到awk | sort | awk
組合的大約600秒。
這裏採用這種想法,我會使用一個Perl腳本來呈現均勻的格式sort
可以平凡處理不同的時間值。
在這種情況下,你似乎有各種各樣的時間格式擔心:
cpu time 9.05 seconds
real time 8:02.07
cpu time 2:25.23
real time 1:39:44.15
目前尚不清楚是否需要保留要排序的行的範圍內,但它似乎我會把時間轉換成規範的形式。你需要允許3位數的實時小時嗎?如果時間到了20.05秒,後綴是否仍然存在?如果時間達到80.05秒,是否打印爲1:20.05?我假設是...
#!/usr/bin/env perl
use strict;
use warnings;
while (<>)
{
if ($_ =~ m/ (?:cpu|real)\stime\s
(?:
(?:(\d+):)? # Hours
(\d\d?): # Minutes
)?
(\d\d?(?:\.\d+)) # Seconds
/msx)
{
my($hh, $mm, $ss) = ($1, $2, $3);
$hh //= 0;
$mm //= 0;
$_ = sprintf "%03d:%02d:%05.2f|%s", $hh, $mm, $ss, $_;
}
print;
}
給定輸入數據:
cpu time 9.05 seconds
real time 8:02.07
cpu time 2:25.23
real time 1:39:44.15
cpu time 25.23 seconds
real time 39:44.15
cpu time 5.23 seconds
real time 44.15 seconds
real time 1:44.15
real time 1:04.15
real time 21:04.15
real time 1:01:04.15
real time 32:21:04.15
real time 122:21:04.15
這將生成的輸出數據:
000:00:09.05|cpu time 9.05 seconds
000:08:02.07|real time 8:02.07
000:02:25.23|cpu time 2:25.23
001:39:44.15|real time 1:39:44.15
000:00:25.23|cpu time 25.23 seconds
000:39:44.15|real time 39:44.15
000:00:05.23|cpu time 5.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:44.15|real time 1:44.15
000:01:04.15|real time 1:04.15
000:21:04.15|real time 21:04.15
001:01:04.15|real time 1:01:04.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
哪些可以被送入一個簡單sort
,以產量:
000:00:05.23|cpu time 5.23 seconds
000:00:09.05|cpu time 9.05 seconds
000:00:25.23|cpu time 25.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:04.15|real time 1:04.15
000:01:44.15|real time 1:44.15
000:02:25.23|cpu time 2:25.23
000:08:02.07|real time 8:02.07
000:21:04.15|real time 21:04.15
000:39:44.15|real time 39:44.15
001:01:04.15|real time 1:01:04.15
001:39:44.15|real time 1:39:44.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
並從其中排序列可以用「sed的」被汽提,得到:
cpu time 5.23 seconds
cpu time 9.05 seconds
cpu time 25.23 seconds
real time 44.15 seconds
real time 1:04.15
real time 1:44.15
cpu time 2:25.23
real time 8:02.07
real time 21:04.15
real time 39:44.15
real time 1:01:04.15
real time 1:39:44.15
real time 32:21:04.15
real time 122:21:04.15
因此,考慮該數據文件是「xx.data」和Perl腳本是xx.pl,命令行是:
perl xx.pl xx.data | sort | sed 's/^[^|]*|//'
是的,我需要保留行的上下文。你最懂我心。謝謝。 – 2010-12-23 15:31:55