Есть ли способ сортировки дат в оболочке, но Ян пришел позже, чем De c? - PullRequest
0 голосов
/ 23 января 2020

У меня есть список месяца, даты и временных меток в файле, подобном этому:

Jan19 03:05
Jan19 15:05
Jan20 03:05
Jan20 15:05
Jan21 03:05
Jan21 15:06
Jan22 03:05
Jan22 15:06
Dec25 15:05
Dec26 14:06
Dec27 15:06
Dec28 15:06
Dec29 14:05
Dec30 14:06
Dec31 15:06

Мне нужно просто получить последние 30 записей. Мой код:

cat file | sort -k1.1,1.3M -k1.4n -k2V 

Этот вид сортирует записи De c как более поздние, чем январь. Я думаю, это потому, что 12 больше 1, но есть ли способ заставить Ян прийти конец этого файла?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Просто замените на регулярное выражение, чтобы подготовить данные для сортировки со значением для января, которое придет после De c:

# JanXY -> 13 XY JanXY ; DecXY -> 12 XY DecXY
sed 's/^Jan\([0-9][0-9]\)/13 \1 &/; s/^Dec\([0-9][0-9]\)/12 \1 &/' |
sort -n -k1 -k2 | cut -d' ' -f3-5
0 голосов
/ 24 января 2020

Предполагая, что все даты в списке находятся в пределах последнего года, как насчет:

now=$(date "+%m%d %H:%M")               # current date and time
declare -A m2n=([Jan]="01" [Feb]="02" [Mar]="03" [Apr]="04"
    [May]="05" [Jun]="06" [Jul]="07" [Aug]="08"
    [Sep]="09" [Oct]="10" [Nov]="11" [Dec]="12"
)
while IFS= read -r line; do
    if [[ $line =~ (^[A-Z][a-z]{2})(.+) ]]; then
        datetime="${m2n[${BASH_REMATCH[1]}]}${BASH_REMATCH[2]}"
        if [[ $datetime > $now ]]; then
            datetime="0$datetime"       # previous year
        else
            datetime="1$datetime"       # this year
        fi
        printf "%s\t%s\n" "$datetime" "$line"
    else
        echo "$line"                    # does not match the expected format
    fi
done < file | sort | cut -f 2-
  • Он сравнивает каждую строку даты с текущей датой / временем в порядке словаря.
  • Если последний больше, предполагается, что дата - это год, и в поле «год» ставится «1», в противном случае - «0».
  • Затем добавьте перед сгенерированной строкой даты оригинальных линий, сортировка и, наконец, удаление части.
...