选择排序
#key 排序类型 1是按照key值排序 2按照value值
#datatype 比较类型 "n"按照数字排序 其他按照字符串排序
#tarr 排序返回的数组
#splitsep 分割字符串 数组中键与值之间分割字符串
#return 数组长度
#实现思路,将原始数组a["a"]=100 排序后变成 a[1]=a分隔符100 ,然后按照下标递归显示内容。 本排序使用冒泡方式进行。
function sort_arr(arr, key, datatype, tarr, splitsep)
{
if(key ~ /[^1-2]/){
return -1
}
delete tarr
tlen = 0
for(k in arr)
{
tarr[++tlen]= k splitsep arr[k]
}
for(m=1; m<=tlen; m++)
{
for(n=m+1; n<=tlen; n++)
{
split(tarr[m], tm, splitsep)
split(tarr[n], tn, splitsep)
if(datatype == "n"){
if(tm[key]+0 < tn[key]+0){
temp = tarr[m]
tarr[m] = tarr[n]
tarr[n] = temp
}
}else{
if((tm[key]"") < (tn[key]"")){
temp = tarr[m]
tarr[m] = tarr[n];
tarr[n] = temp
}
}
}
}
return tlen
}
使用示例:
len = sort_arr(queue, 2, "n", sortq, ":")
ref:
awk 快速排序:http://www.kuqin.com/article/24shell/736994.html
awk 多种排序方法:http://www.cnblogs.com/chengmo/archive/2010/10/09/1846696.html
计算2000年之后任何一天是星期几
# algorithm for judge one day is what day
# http://zh.wikipedia.org/wiki/星期的計算
function whatday(year, month, day) {
yyyy = year - 2000
if( yyyy < 0 ) return -1
if( yyyy % 4 == 0 && month <= 2 ){
leap_dd = int(yyyy / 4)
}else{
leap_dd = int(yyyy / 4) + 1
}
M = "5 1 1 4 6 2 4 0 3 5 1 3"
split(M, m_arr, " ")
mm = m_arr[month]-0
dd = day
return (yyyy+leap_dd+mm+dd)%7
}
使用示例:
# Extract hour and judge day kind
hour = -1
if( time ~ /^.*-.*-.* .*:.*:.*$/){
len = split(time, time_array, " ")
if( len == 2){
date_str = time_array[1]
time_str = time_array[2]
m = split(date_str, date_arr, "-")
if( m == 3){
year = date_arr[1]
month = date_arr[2]
day = date_arr[3]
}
weekday = whatday(year, month, day)
if( weekday == -1 ){
daykind = -1
}else if( weekday == 0 || weekday == 6 ){
daykind = WEEKEND
}else{
daykind = WORKDAY
}
n = split(time_str, time_arr, ":")
if( n == 3){
hour = time_arr[1]
}
}
}
ref: