두 가지 다른 형식의 날짜가 포함된 날짜 열이 있는 탭으로 구분된 파일이 있습니다. 이 정렬 명령을 사용하여 하나의 형식 유형("%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:%S
awk
date
변환할 필드 번호는 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
.