DD-MM-YYYY 날짜별로 파일을 정렬하는 방법

DD-MM-YYYY 날짜별로 파일을 정렬하는 방법

다음을 포함하는 파일에서:

...
18-11-2018:othercharacters
10-11-2018:othercharacters
03-10-2018:othercharacters
30-10-2018:othercharacters
27-09-2018:othercharacters
03-12-2018:othercharacters
...

주문하다:

sort -t- -k2 -k1 

날짜별로 정렬되지 않습니다. 무엇을 놓치고 있나요?

답변1

이것이 권장되는 날짜 형식이 YYYY-MM-DD인 이유 중 하나입니다.

-k2두 번째 필드로 시작하는 행 부분을 정렬하려면 -k2,2두 번째 필드만 정렬하면 됩니다.

sort -b -t- -k2,2 -k1,1

또는:

sort -b -k1.7,1.10 -k1.4,1.5 -k1.1,1.2

먼저 연도별로 정렬(첫 번째 필드의 7~10번째 문자(필드의 선행 공백을 무시하고 -b기본 필드 구분 기호를 사용하여 계산됨(공백이 아닌 문자를 공백으로 변환))), 월별로 일을 정렬합니다.

답변2

-k2with를 사용하면 sort유틸리티가 두 번째 필드부터 시작하는 전체 행을 정렬 키로 사용하게 됩니다. 이 정렬 키가 고유하지 않은 경우 -k1후자는 절대 사용되지 않습니다 . 두 번째 필드만 첫 번째 정렬 키로 사용하려면 를 사용하세요 -k2,2. 다른 정렬 키가 고유하지 않은 경우(그리고 "전체 행"이 첫 번째 필드에서 시작하는 경우) -k1기본적으로 전체 행이 정렬 키로 사용되므로 추가할 필요가 없습니다 .-k1,1sort

즉, 다음 세 명령은 동일합니다.

sort -t - -k 2,2 -k 1,1 file
sort -t - -k 2,2 -k 1 file
sort -t - -k 2,2 file

다음은 보다 일반적인 솔루션입니다.

데이터가 필드 구분자로 사용되는 "간단한" 헤더 없는 CSV 파일로 구문 분석될 수 있다고 가정하면 :첫 번째 필드의 날짜를 새 필드의 Unix 타임스탬프로 변환하고 해당 새 필드를 기준으로 정렬한 다음 해당 필드를 삭제할 수 있습니다. 이것은 때때로 호출됩니다.슈워츠 변환.

사용밀러:

$ mlr --csvlite --fs : -N put '$key = strptime($1,"%d-%m-%Y")' then sort -f key then cut -x -f key file
27-09-2018:othercharacters
03-10-2018:othercharacters
30-10-2018:othercharacters
10-11-2018:othercharacters
18-11-2018:othercharacters
03-12-2018:othercharacters

put표현식은 명명된 필드를 생성 key하고 호출 결과와 함께 호출됩니다 strptime(). 이는 ("2018-11-18")과 유사한 Unix 타임스탬프이며 1542499200.0000001970-01-01이 시작된 이후의 초 수를 나타냅니다. 그런 다음 sort필드에 대한 작업을 사용하고 로 삭제합니다 cut -x.

답변3

보다 일반적인 연/월/일 정렬 솔루션으로 :초기 콜론( )을 콜론+대시( -:)로 바꾸고 필드 3, 2, 1로 정렬한 다음 콜론+대시를 콜론으로 바꿔 완료할 수 있습니다. (이렇게 하면 연도가 행의 나머지 부분과 별도의 필드로 분리되어 행과 독립적으로 정렬될 수 있습니다. 이는 -:데이터의 처음 세 필드에서는 발생하지 않는다고 가정합니다 .)

sed 's/:/-:/' file | sort -t'-' -k3,3 -k2,2 -k1,1 | sed 's/-:/:/'

우리에게 보여준 데이터세트로 연도를 정렬할 필요가 없는 것 같다는 점은 감사하지만 이는 문제를 일반화하는 한 가지 방법입니다.

관련 정보