几个实用的awk程序

选择排序

#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:

http://zh.wikipedia.org/wiki/星期的計算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值