두 가지 날짜/시간 형식으로 열 정렬

두 가지 날짜/시간 형식으로 열 정렬

두 가지 다른 형식의 날짜가 포함된 날짜 열이 있는 탭으로 구분된 파일이 있습니다. 이 정렬 명령을 사용하여 하나의 형식 유형("%a %b %d %H:%M:%S %Z %Y")으로 정렬하고 있지만 날짜 열을 기준으로 정렬할 수 있는 방법이 있습니까? 체재? 감사해요!

입력하다

date
Mon Mar 02 03:56:26 UTC 2020
2020-03-03 15:46:52

sort -t$'\t' -k 3.25,3.28n -k 3.5,3.7M -k 3.9,3.10n -k 3.12,3.13n -k 3.15,3.16n -k3.18,3.19n sample.csv

답변1

두 형식을 모두 명확한 시간(예: 에포크 시간)으로 변환하고 정렬한 다음 삭제할 수 있습니다. 예를 들어밀러

mlr --tsv put '
  $epoch = ($date =~ "^[A-Z][a-z][a-z]") ? strptime($date,"%a %b %d %H:%M:%S %Z %Y") : strptime($date,"%Y-%m-%d %H:%M:%S")
' then sort -n epoch then cut -f date input

답변2

및 명령을 사용하여 "%a %b %d %H:%M:%S %Z %Y"형식(또는 인식하는 다른 형식)을 ( ) date -d로 변환해 보십시오 .%F %T%Y-%m-%d %H:%M:%Sawkdate

변환할 필드 번호는 awk 변수에 제공됩니다. col필드가 이미 올바른 형식이면 해당 필드를 건너뜁니다. 글쎄, 해당 검사를 제거할 수 있지만 분명히 그렇게 하면 스크립트가 느려질 것입니다.

awk -v col=3 '
  BEGIN{ FS=OFS="\t" }

  # or remove the check and begin the next line with an opening `{`
  $(col) !~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/{
    cmd="date -u -d \"" $(col) "\" +\"%F %T\"" 
    cmd | getline $(col)
    close(cmd)
    $0=$0
  }
  1
' infile > outfile

그런 다음 필수 필드(예: )에 사전 정렬을 사용합니다 sort -t$'\t' -k3,3 file.

관련 정보