Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 不同顺序的多重排序_Linux_Unix_Sorting - Fatal编程技术网

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的格式。编辑器支持一组相当丰富的显示选项。有些是以编辑框上方的工具栏按钮的形式提供的,有些则需要阅读文档——在编辑时查看侧边栏。