我在这样的文件中具有月份,日期和时间戳的列表:
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到达此文件的末尾?
假设列表中的所有日期都在从现在起的过去一年之内,如何:
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-
只需用正则表达式替换即可准备要排序的数据,其值将是十二月之后的一月份的值:
# 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