Linux 不同顺序的多重排序
我有这样的数据Linux 不同顺序的多重排序,linux,unix,sorting,Linux,Unix,Sorting,我有这样的数据 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 1
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
^^ ^^^^
sort -k 1.6,1.8 date.txt | sort -k 1.14,1.17 -r > final.txt
我必须按两个偏移量排序,用^
s表示
第一个高亮显示的偏移量应按ASC顺序排序,然后按DESC顺序第二个高亮显示。所以我喜欢这个
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
^^ ^^^^
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
这是工作良好,但我需要在单一的排序命令。
有什么建议吗?我在手册页上找到了这个有趣的小贴士:
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.
下面是第一个步骤:
sort-k1.6,1.8 date.txt | sort-k1.14,1.17-r
那么:
sort -k 2.7r,2.10 -k 2.1,2.2 date.txt
请记住[*],字段由空格分隔,从1开始计数,因此日期字段是字段2
[*]不记得了!我是在夸夸其谈。使用不熟悉的命令时,请阅读手册页。字段的编号方式是不同命令之间差别很大的细节之一。我不知道如何使用单个
排序
命令来实现这一点。当我必须解决这类问题时,我使用perl
脚本。类似于以下简单脚本的内容将为您完成这项工作(并使您能够灵活地按所需字段进行排序,并按所需顺序进行排序):
#/usr/bin/perl
@行=();
while(){push(@lines,$)}
@排序{
$a1=substr($a,0,6);
$ayear=substr($a,12,4);
$b1=substr($b,0,6);
$byear=substr($b,12,4);
如果($ayear==$byear){返回$b1 cmp$a1;}
else{return$byear cmp$ayear;}
}@行;
打印@已排序;
然后,当然
$ perl sorter.perl < data.txt
$perl sorter.perl
perl
sort
文档位于,但是为什么管道的变体对您不利呢?这是经典的“Unix方式”:)我用降价取代了基于html的格式。编辑器支持一组相当丰富的显示选项。有些是以编辑框上方的工具栏按钮的形式提供的,有些则需要阅读文档——在编辑时查看侧边栏。