Linux/UNIX Shell:排序日期

时间:2020-01-09 10:42:24  来源:igfitidea点击:

问题描述:如何排序以以下示例格式存储在文本文件中的数据的日期类型:

Code Date TIME  
 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  
 MHOS051 05/12/2008 10AM  
 MHOS041 20/12/2008 2PM  
 MHOS042 27/12/2008 2PM  
 MHOS053 11/12/2008 10AM  
 MHOS043 30/12/2008 2PM

如何明智地对数据进行日期和时间排序?

答:使用sort命令以按排序顺序显示其输入的行。
它具有特殊的选项,称为-M,用于对月份进行排序。
共有3个字段。
第一个是某种代码。
第二个是DD/MM/YYYY格式的实际日期,第三个是时间。
您需要使用sort命令的-k选项对第二列和第三列进行排序,如下所示:

$ sort -k 2,2n -k 3 data.file.txt

输出示例:

MHOS051	05/12/2008	10AM
ZFT01	06/12/2008	10AM
MHOS053	11/12/2008	10AM
HOS73	11/12/2008	2PM
HOS06	15/12/2008	2PM 
MHOS041	20/12/2008	2PM
HOS05	23/12/2008	10AM
HOS64	23/12/2008	2PM 
HOS70	26/12/2008	10AM
MHOS042	27/12/2008	2PM 
HOS62	29/12/2008	10AM 
MHOS043	30/12/2008	2PM

其中:

  • -k 2,2n -k 3:使用给定的列号对数据进行排序。选项-k 2,2n -k 3对每一列进行排序。首先,它将对第二列(日期dd字段)进行排序,然后对第三列(时间)进行排序。
  • data.file.txt:输入文件

多级排序

现在考虑如下数据:

MHOS051	05/12/2008	10AM
ZFT01	06/12/2008	10AM
MHOS053	11/12/2008	10AM
MHOS051	10/01/2009	10AM
HOS73	11/12/2008	2PM
HOS06	15/12/2008	2PM 
MHOS041	20/12/2008	2PM
HOS05	23/12/2008	10AM
HOS64	23/12/2008	2PM 
MHOS051	12/04/2009	10AM
HOS70	26/12/2008	10AM
MHOS042	27/12/2008	2PM 
HOS62	29/12/2008	10AM 
MHOS051	27/01/2009	10AM
MHOS043	30/12/2008	2PM

现在,您需要首先使用F [.C] [OPTS]格式对年份进行排序,然后对日期进行排序,其中F是要使用的字段编号,C是从字段开头开始的第一个字符的编号。
您需要使用sort命令,如下所示:

$ sort -n -k 2.9 -k 2.5 -k 2 data.file.txt

输出示例:

MHOS051	05/12/2008	10AM
ZFT01	06/12/2008	10AM
HOS73	11/12/2008	2PM
MHOS053	11/12/2008	10AM
HOS06	15/12/2008	2PM 
MHOS041	20/12/2008	2PM
HOS05	23/12/2008	10AM
HOS64	23/12/2008	2PM 
HOS70	26/12/2008	10AM
MHOS042	27/12/2008	2PM 
HOS62	29/12/2008	10AM 
MHOS043	30/12/2008	2PM
MHOS051	10/01/2009	10AM
MHOS051	27/01/2009	10AM
MHOS051	12/04/2009	10AM

其中:

  • -n:对数字数据进行排序
  • -k 2.9:选择第2个字段和第9个字符进行排序(即按年份的最后一位排序)
  • -k 2.5:选择第二个字段和第五个字符进行排序(即按月的最后一位排序)
  • -k 2:选择第二个字段并进行排序
  • data.file.txt:输入文件