특정 파일의 날짜별로 정렬(dd-Mmm-yyyy 형식)

특정 파일의 날짜별로 정렬(dd-Mmm-yyyy 형식)

그래서 다음 파일이 있습니다.

    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되므로 문제가 되지 않습니다 . 이와 같이 사용하면0head정기적인파일(또는 다른 검색 가능한 파일)을 입력으로 사용하면 파이프에서는 작동하지 않습니다(GNU를 사용하면 로 sed바꿀 수 있음 ).head -n1sed -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...은 월 번호가 아니라 월 번호에 따라 숫자가 증가함). 그런 다음 어휘적으로 정렬하고 삭제를 사용합니다. .xxmonthscut

awk(POSIX 문자 클래스를 지원 하지 않는 경우 ) 다음으로 mawk바꿀 수 있습니다 (필요에 따라 추가 공백 문자가 목록에 추가됨).[[:space:]][ \t]


1 GNU는 sortGNU 시스템과 대부분의 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

관련 정보