是否有一种方法可以在shell中对日期进行排序,但Jan的出现时间要晚于Dec?

问题描述 投票:0回答:2

我在这样的文件中具有月份,日期和时间戳的列表:

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 

这种排序对Dec条目的排序比对Jan的排序最近。我认为这是因为12大于1,但是是否有办法让Jan到达此文件的末尾?

bash shell
2个回答
0
投票

假设列表中的所有日期都在从现在起的过去一年之内,如何:

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”。
  • 然后将生成的日期字符串放在原始行的前面,排序,最后删除该部分。

0
投票

只需用正则表达式替换即可准备要排序的数据,其值将是十二月之后的一月份的值:

# 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
© www.soinside.com 2019 - 2024. All rights reserved.