그래서 다음 파일이 있습니다.
Certificate Name,Expiry Date,Type,Certificate file path
CN=server10.de.go.com:app, 16-Jan-2021, physical, /path/to/file/
CN=sv999-c.int.de.aaas.internet.go.com:testclient, 31-Oct-2020, vm, /path/to/file/
CN=server26.de.go.com:app, 06-Feb-2021, physical, /path/to/file/
가장 오래된 날짜를 먼저 표시하고 최신 날짜를 마지막에 표시하도록 파일을 정렬하려면 어떻게 해야 합니까?
아래 명령을 사용해 보았지만 작동하지 않습니다(날짜의 요일 부분만 정렬하고 그 이상은 정렬하지 않음).
sort -t "," -k 2 file
또한 sort 명령이 헤더를 캡처하지 않는지 확인해야 합니다.
조금만 도와주세요.
답변1
GNU 또는 Compatible 1을 사용하면 월 이름에 정렬 플래그를 sort
사용할 수 있습니다 .M
{
head -n1
LC_ALL=C sort -t, -k2.9n -k2.5,2.7M -k2n
} < file
또는 뒤에 있는 간격을 무시하십시오 ,
(항상 완전히 정확하지 않은 경우).하나SPC 문자):
{
head -n1
LC_ALL=C sort -t, -k2.8bn -k2.4b,2.6bM -k2n
} < file
(여기서 C 로케일은 사용자 언어의 월 이름이 아닌 영어 월 이름을 예상하는 데 사용됩니다.)
여기서는 헤더를 에 전달하는 것을 방지 하지만, 그렇게 해도 해당 헤더의 첫 번째 정렬 키(연도)가 으로 계산되어 먼저 정렬 sort
되므로 문제가 되지 않습니다 . 이와 같이 사용하면0
head
정기적인파일(또는 다른 검색 가능한 파일)을 입력으로 사용하면 파이프에서는 작동하지 않습니다(GNU를 사용하면 로 sed
바꿀 수 있음 ).head -n1
sed -u q
POSIXly에서는 다음과 같이 할 수 있습니다.
awk -F',[[:space:]]*' -v months=JanFebMarAprMayJunJulAugSepOctNovDec '
NR == 1 {print; next}
{
split($2, f, "-")
printf "%04d%02d%02d\t%s\n", f[3], index(months, f[2]), \
f[1], $0 | "sort | cut -f2-"
}' < file
해당 변수의 월 약어 위치를 2020xx15
각 행 앞에 추가합니다 (따라서 값 01, 04, 07, 10...은 월 번호가 아니라 월 번호에 따라 숫자가 증가함). 그런 다음 어휘적으로 정렬하고 삭제를 사용합니다. .xx
months
cut
awk
(POSIX 문자 클래스를 지원 하지 않는 경우 ) 다음으로 mawk
바꿀 수 있습니다 (필요에 따라 추가 공백 문자가 목록에 추가됨).[[:space:]]
[ \t]
1 GNU는 sort
GNU 시스템과 대부분의 BSD에 존재하지만 일부 BSD는 자체 GNU를 호환 가능한 API로 대체했습니다. busybox는 sort
이제 이 M
플래그도 지원합니다(비록 적어도 1.30.1에서는 오프셋을 포함한 주요 사양과 결합할 때 문제가 있는 것 같습니다. 여기에서 작동하려면 키 끝 부분을 제거해야 한다는 것을 알았습니다).
답변2
Perl은 날짜 구문 분석 및 정렬을 수행할 수 있습니다.
perl -MTime::Piece -F, -ane '
next if $. == 1;
push @lines, [$_, Time::Piece->strptime($F[1], " %d-%b-%Y")->epoch];
END {
@sorted = sort {$a->[1] <=> $b->[1]} @lines;
print $sorted[$_]->[0] for (0,-1);
}
' file
CN=sv999-c.int.de.aaas.internet.go.com:testclient, 31-Oct-2020, vm, /path/to/file/
CN=server26.de.go.com:app, 06-Feb-2021, physical, /path/to/file/
답변3
나는 사용하는 것을 좋아한다종류유연성 때문입니다. 다음은 데모 스크립트의 일부입니다.
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE
pl " Modified ( ', ' -> ',') input file t1:"
sed 's/, /,/g' $FILE > t1
head t1
pl " Results, msort:"
{
head -n1
msort -q -l -j -d "," -n 2,2 --comparison-type date --date-format "d-m-y"
} < t1
생산:
-----
Input data file data1:
Certificate Name,Expiry Date,Type,Certificate file path
CN=server10.de.go.com:app, 16-Jan-2021, physical, /path/to/file/
CN=sv999-c.int.de.aaas.internet.go.com:testclient, 31-Oct-2020, vm, /path/to/file/
CN=server26.de.go.com:app, 06-Feb-2021, physical, /path/to/file/
-----
Modified ( ', ' -> ',') input file t1:
Certificate Name,Expiry Date,Type,Certificate file path
CN=server10.de.go.com:app,16-Jan-2021,physical,/path/to/file/
CN=sv999-c.int.de.aaas.internet.go.com:testclient,31-Oct-2020,vm,/path/to/file/
CN=server26.de.go.com:app,06-Feb-2021,physical,/path/to/file/
-----
Results, msort:
Certificate Name,Expiry Date,Type,Certificate file path
CN=sv999-c.int.de.aaas.internet.go.com:testclient,31-Oct-2020,vm,/path/to/file/
CN=server10.de.go.com:app,16-Jan-2021,physical,/path/to/file/
CN=server26.de.go.com:app,06-Feb-2021,physical,/path/to/file/
달리다:
Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 5.7.0-3-amd64, x86_64
Distribution : Debian GNU/Linux bullseye/sid
bash GNU bash 5.0.18
유연성의 일부는 맨 페이지의 예와 같이 우수한 기능적 디자인에서 비롯됩니다.
-f,--date-format <date format>
Permutation of ymd with separators, e.g. y-m-d for international
date format, m/d/y for American date format, or a permutation of
yd with separators, e.g. y-d, for day-of-year dates. All three
components may be numbers in any available number system. The
month field may also be a month name, determined by the same de-
vices as independent month name fields.
이것종류코드는 많은 저장소에서 사용할 수 있습니다. 다음은 몇 가지 추가 정보입니다.
msort sort records in complex ways (man)
Path : /usr/bin/msort
Version : 8.53
Type : ELF 64-bit LSB shared object, x86-64, version 1 ( ...)
Help : probably available with -h,--help
Repo : Debian GNU/Linux bullseye/sid
Home : http://www.billposer.org/Software/msort.html (pm)
최고의 현명한 움직임... 건배, drl