日期排序格式:日-月-年

日期排序格式:日-月-年

我有一个带有日期值的文本文件。

数据:

01-Sep-21
02-Jan-22
12-Aug-21
24-Dec-21
11-Jul-22

如何将这些数据从旧日期值到新日期值排序?

答案1

通过 GNU 实现sort并假设所有日期都来自同一世纪:

<your-file LC_ALL=C sort -t- -k3,3n -k2,2M -k1,1n

其中-t指定字段分隔符,-k <start>,<end><flags>指定排序键的开始、结束位置以及如何通过<flags>.

n标志用于数字比较,M(GNU 扩展)用于月份名称或缩写比较(此处,通过将区域设置固定为C月份名称为英文,假定为英文)。

因此,在这里,排序键首先是年份(n以数字方式进行比较,尽管词法比较也可以工作,因为它们在示例中始终为 2 位数字),然后是月份缩写字段(与Month 进行比较),然后是日期(同样)进行数字比较,尽管词汇也可以)。

通过 GNU 实现date,您还可以执行以下操作:

date -f your-file +%F | sort

与...一样:

date --iso-8601 -f your-file | sort

将这些日期转换为标准 YYYY-MM-DD 格式,可以按原样按词法排序(至少在 9999-12-31 之前)。

对于当前版本的 GNU date,根据测试,似乎 01-Jan-00 到 31-Dec-69 是 2000-01-01 到 2069-12-31,而 01-Jan-70 到 31-Dec-99 是 1970- 01-01 至 1999-12-31。

在非 GNU 系统上,您始终可以使用 Schwartzian 变换/装饰-排序-取消装饰方法:

<your-file awk -F- '{printf "%s%02d%s\t%s\n", $3, index("JanFebMarAprMayJunJulAugSepOctNovDec",$2), $1, $0}' |
  sort | cut -f2-

并决定世纪截止日期,并将月份名称不区分大小写地与以下内容匹配:

<your-file awk -F- '
  {
    printf "%s%02d%s\t%s\n", \
      $3 + ($3 < 70 ? 2000 : 1900), \
      index("jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec", tolower($2)), \
      $1, \
      $0
  }' |
  sort |
  cut -f2-

1 例如,一个世纪从 2001-01-01 到 2100-12-31,我的意思是,如果有一个01-Sep-21and 12-Jan-86,例如,这意味着 2021 年和 2086 年或 1921 年和 1986 年,而不是 1986 年和 2021 年。

答案2

使用 Python 和日期文件dates.txt

from datetime import datetime
with open('dates.txt') as f:
    dts = [datetime.strptime(line.rstrip(), '%d-%b-%y') for line in f]
for k in sorted(dts):
    print(k.strftime('%d-%b-%y'))

dateutil.parser如果您想用不同的语法解析日期,也可以使用:

from dateutil import parser
with open('dates.txt') as f:
    dts2 = [parser.parse(line) for line in f]
for k in sorted(dts2):
    print(k.strftime('%d-%b-%y'))

两个输出相同,从最旧到最新:

12-Aug-21
01-Sep-21
24-Dec-21
02-Jan-22
11-Jul-22

答案3

您可以使用datesortfrom对日期进行排序dateutils,使用-i, --input-format=选项:

datesort -i '%d-%b-%y' infile

您还可以为日期指定不同的区域设置,例如

datesort -i '%d-%b-%y' --from-locale=it_IT <<\IN
01-Dic-21
22-Gen-22
12-Ago-21
24-Set-21
11-Lug-22
09-Ott-20
21-Ago-19
IN
19 年前 21 日
09-奥特-20
21 年前 12 日
24-集-21
01-Dic-21
22-Gen-22
11-凸耳-22

相关内容