날짜 값이 포함된 텍스트 파일이 있습니다.
데이터:
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자리이기 때문에 어휘 비교도 작동함), 월 약어 필드( M
onth와 비교), 날짜(다시)가 숫자로 수행됩니다. 비교(어휘도 작동하지만).
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년 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-21
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
datesort
from을 사용하여 날짜를 정렬 할 수 있습니다 .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