我有一个包含两列元素(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
答案 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
会工作!