日付ソート形式:日 - 月 - 年

日付ソート形式:日 - 月 - 年

日付値を含むテキストファイルがあります。

データ:

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ロケールを月名で固定してC英語と仮定)に使用されます(GNU拡張)。

したがって、ここでソートキーは最初に年(数値的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現在のバージョンでは、date01-Jan-00〜31-Dec-69は2000-01-01〜2069-12-31、01-Jan-70〜31-Dec-99のようです。 1970年1月1日から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-

01-Sep-211 たとえば、1世紀は2001-01-01から2100-12-31までです。つまり、 と があるとすると、1986年と2021年では12-Jan-86なく、2021年と2086年、または1921年と1986年を意味します。

答え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
12日前 21
24-エピソード-21
01-Dic-21
22世代-22
11-ラグ-22

関連情報