排序重复日期明智

时间:2017-08-20 09:14:05

标签: shell sorting unix sh

我有一个包含两列元素(id和date)的文件。我想根据它的id对这些元素进行排序,如果有几个元素具有相同的id,它们将根据它们的日期进行排序。

我使用了sort -t" " -k2 -t"/" -k3 -k2 -k1 file.txt,但这并没有奏效。 我不知道如何使用已归档的分隔符。

输入文件

01/02/2012 1
02/03/2012 1
04/04/2012 1
01/02/2015 2
02/03/2014 2
04/04/2013 2

和输出文件应为:

01/02/2012 1                                                                                                                                                                                      
02/03/2012 1                                                                                                                                                                                      
04/04/2012 1                                                                                                                                                                                     
04/04/2013 2                                                                                                                                                                                      
02/03/2014 2                                                                                                                                                                                     
01/02/2015 2

3 个答案:

答案 0 :(得分:1)

创意:尝试使用一个字段分隔符(sort不处理两个或更多不同的分隔符)。

$  cat file                                                                                                                               
01/02/2012 1                                                                                                                                        
02/03/2012 1                                                                                                                                        
04/04/2012 1                                                                                                                                        
01/02/2015 2                                                                                                                                        
02/03/2014 2                                                                                                                                        
04/04/2013 2
$  sed 's, ,/,' file | sort -t '/' -k4 -k3 -k2 -k1 | sed 's,\(.*\)/\([^/]*\),\1 \2,'                                                      
01/02/2012 1                                                                                                                                        
02/03/2012 1                                                                                                                                        
04/04/2012 1                                                                                                                                        
04/04/2013 2                                                                                                                                        
02/03/2014 2                                                                                                                                        
01/02/2015 2

第一个sed将空格字符替换为/,而sort替换为/分隔符,下一个sed将最后/替换为DD/MM/YYYY空间。

我不知道您的日期格式是MM/DD/YYYY还是-k4 -k3 -k2 -k1左右,您可能希望-k4 -k3 -k1 -k2中的sort重新 nameVariations: { type: Sequelize.ARRAY(Sequelize.STRING), allowNull: true, } (我假设第一个版本)。

答案 1 :(得分:1)

与@ uzsolt的答案类似,Schwartzian变换

sed -r 's#([0-9]{2})/([0-9]{2})/([0-9]{4})#\3\2\1 &#' file |
  sort -t " " -n -k 3,3 -k 1,1 |
  cut -d " " -f 2-

第一个命令在行的开头添加一个更明智的日期:

01/02/2012 1    =>    20120201 01/02/2012 1

然后按字段3进行简单的数字排序,然后是字段1 然后切断新添加的第一个字段。

答案 2 :(得分:0)

坦率地说,我非常肯定你可以制作一个复杂的表达方式来指导sort了解日期,但你真的不应该这样做。

这是python中的几行可读;

之类的东西
#!/usr/bin/env python2
from dateutil import parser
import sys

class comparable_line(object):
     def __init__(self, line):
         spacepos = line.find(" ")
         if spacepos < 0:
              raise ValueError("line must contain a space")
         self._num = int(line[spacepos+1:])
         self._date = parser.parse(line[:spacepos])

     def __cmp__(self, other):
         """" comparison method that is automatically called by python """"
         if self._num < other._num:
             return -1
         if self._num > other._num:
             return 1
         # at this point we know that the numbers are equal
         if self._date < other._date:
             return -1
         if self._date > other._date:
             return 1
         # totally equal: return equality (0)
         return 0
    def __str__(self):
         return "{num:d} {day:02d}/{month:02d}/{year:4d}".format(self._num, self._date.day, self._date.month, self._date.year)

sortedlines = [comparable_line(l) for l in sys.stdin].sort()
for line in sortedlines:
    print line

警告:一切都在我脑后。未经测试。但这可以处理任意明智的日期格式(顺便说一句,你的日期格式是一种糟糕的日期格式 - 是MM / DD / YYYY,还是DD / MM / YYYY ???)。

所以,输入文件如

2013-01-01/00:00:12 3
2013-01-01/00:00:15 3

会工作!