2011-10-22 41 views
2

多个分拣我有这样用不同的顺序

HOS05 23/12/2008 10AM 
HOS06 15/12/2008 2PM 
HOS62 29/12/2008 10AM 
HOS64 23/12/2008 2PM 
HOS70 26/12/2008 10AM 
ZFT01 06/12/2008 10AM 
HOS73 11/12/2008 2PM 
MHOS0 05/12/2008 10AM 
MHOS0 20/12/2008 2PM 
MHOS0 27/12/2010 2PM 
MHOS0 11/12/2008 10AM 
MHOS0 30/12/2009 2PM 
     ^^ ^^^^ 

我具有由该指示与^的两个偏移进行排序的数据。

第一个突出显示的偏移量应按ASC顺序排序,然后以DESC顺序再次突出显示。所以,我没有这样的

sort -k 1.6,1.8 date.txt | sort -k 1.14,1.17 -r > final.txt 

输出:

MHOS0 27/12/2010 2PM 
MHOS0 30/12/2009 2PM 
ZFT01 06/12/2008 10AM 
MHOS0 20/12/2008 2PM 
MHOS0 11/12/2008 10AM 
MHOS0 05/12/2008 10AM 
HOS73 11/12/2008 2PM 
HOS70 26/12/2008 10AM 
HOS64 23/12/2008 2PM 
HOS62 29/12/2008 10AM 
HOS06 15/12/2008 2PM 
HOS05 23/12/2008 10AM 

这是工作正常,但我需要一个sort命令。 有什么建议吗?

+2

但为什么用管,变体是对你不好?这是经典的“Unix方式”:) – xappymah

+0

我用markdown替换了基于html的格式。编辑器支持一套相当丰富的显示选项。有些在编辑框中以工具栏按钮的形式提供,其他人需要阅读文档 - 在编辑时查看边栏。 – dmckee

回答

2

我发现在这个手册页多汁珍闻:

POS is F[.C][OPTS], where F is the field number and C the character position in the field; both 
    are origin 1. If neither -t nor -b is in effect, characters in a field are counted from the 
    beginning of the preceding whitespace. OPTS is one or more single-letter ordering options, 
    which override global ordering options for that key. If no key is given, use the entire line as 
    the key. 

而这里的第一个观点:

排序-k 1.6,1.8 date.txt |排序-k 1.14,1.17 -r

因此,如何:

sort -k 2.7r,2.10 -k 2.1,2.2 date.txt 

记住[*],字段由空格分隔,并从1计数,所以你的日期字段是场2

[*]不记得这个!我正在修辞。只需在使用不熟悉的命令时阅读联机帮助页即可。字段如何编号是不同命令之间差异很大的细节之一。

1

我不知道如何通过单一的sort命令实现此目的。当我必须解决这类问题时,我使用perl脚本。类似的事情下面简单的脚本会为你做这项工作(并给你的灵活性,任何你想要的字段进行排序,可以以任意顺序你想要的):

#!/usr/bin/perl 

@lines =(); 
while (<>) { push(@lines, $_); } 

@sorted = sort { 
    $a1 = substr($a, 0, 6); 
    $ayear = substr($a, 12, 4); 
    $b1 = substr($b, 0, 6); 
    $byear = substr($b, 12, 4); 
    if ($ayear == $byear) { return $b1 cmp $a1; } 
    else { return $byear cmp $ayear; } 
} @lines; 

print @sorted; 

,然后,当然,

$ perl sorter.perl < data.txt 

perlsort文档在http://perldoc.perl.org/functions/sort.html