awk built-in functions

参考: http://www.gnu.org/software/gawk/

1. Numeric

int(x): return the nearest integer
rand(): return a random number
srand([x]): set the starting seed for random generator; if x is omitted, the current date and time are used for a seed.

$ awk 'BEGIN{print int(1.8), int(-1.8), int(010), int(0x0A), int(3a), int(b2)}'                                           
1 -1 8 10 3 0 

# rand()
function roll(n) { return 1 + int(rand() * n) }                                                                                                                                                                                                                                    
{ printf("%d points", roll(6) + roll(6) + roll(6)); } 

# fixed seed, unchanged random number
$ awk 'BEGIN{srand(1); print rand()}'                                                                                     
0.237788                                                                                                                          
$ awk 'BEGIN{srand(1); print rand()}'                                                                                     
0.237788                             

# the current date and time as a seed                                                                                             
$ awk 'BEGIN{srand(); print rand()}'                                                                                      
0.367979                                                                                                                          
$ awk 'BEGIN{srand(); print rand()}'                                                                                      
0.291809 

2. String

2.1 sort

2.1.1 sorted by values.

len = asort(a): a is changed, the indices are replaced by sequential integers starting with one
len = asort(a, b): a isn’t changed. b is new array that comprises sequential integer indices and values of a.

2.1.1 sorted by indeces.

len = asorti(a): s is changed. the indices change into values, the sequential integers act as the indices
len = asorti(a, b): s isn’t changed. b is new array that comprises sequential integer indices and values came from the indices of a.

$ cat afile                                                                                                               
last de                                                                                                                           
first sac                                                                                                                         
middle cul

$ awk '{a[$1]=$2} END{for(i in a) print i, a[i]}' afile                                                                   
first sac                                                                                                                         
middle cul                                                                                                                        
last de  

$ awk '{a[$1]=$2} END{len=asort(a); for(i=1;i<=len;i++) print i, a[i]}' afile                                             
1 cul                                                                                                                             
2 de                                                                                                                              
3 sac  

$ awk '{a[$1]=$2} END{len=asort(a,b); for(i=1;i<=len;i++) print i, b[i]}' afile                                           
1 cul                                                                                                                             
2 de                                                                                                                              
3 sac 

$ awk '{a[$1]=$2} END{len=asorti(a); for(i=1;i<=len;i++) print i, a[i]}' afile                                            
1 first                                                                                                                           
2 last                                                                                                                            
3 middle                                                                                                                          

$ awk '{a[$1]=$2} END{len=asorti(a,b); for(i=1;i<=len;i++) print i, b[i], a[b[i]]}' afile                                 
1 first sac                                                                                                                       
2 last de                                                                                                                         
3 middle cul   

2.2 substitution

result = gensub(regexp, replacement, how, [target]): “how” is g/G/1-n

$ gawk 'BEGIN{a="abc def"; b=gensub(/(.+) (.+)/, "\\2 \\1", "g", a); print b}'                                            
def abc  

$ echo "a b c a b c" | gawk '{s=gensub(/a/, "AA", 2); print s}'                                                           
a b c AA b c

sub(regexp, replacement [, target])
gsub(regexp, replacement [, target]): global sub()

$ awk 'BEGIN{s="water, water, everywhere"; sub(/at/,"ith",s); print s}'                                                   
wither, water, everywhere

# the precise substring (&) 
$ awk 'BEGIN{s="daabaaaa"; sub(/a+/, "C&C", s); print s}'                                                                 
dCaaCbaaaa

$ cat bfile                                                                                                               
American                                                                                                                          
Britain                                                                                                                           
China                                                                                                                             
Germany                                                                                                                           
France                                                                                                                            
$ awk '{gsub(/Britain/, "United Kingdom"); print}' bfile                                                                  
American                                                                                                                          
United Kingdom                                                                                                                    
China                                                                                                                             
Germany                                                                                                                           
France 

2.3 substring

substr(string, start [, length ])
split(string, array [, fieldsep [, seps ] ])

$ awk 'BEGIN{a="abcdefg";b=substr(a,1,2)"CDE"substr(a,6); print b}'                                                       
abCDEfg  

$ awk 'BEGIN{split("cul-de-sac",a,"-",seps); for(i in a) print "a["i"]="a[i]; for(j in seps) print "seps["j"]="seps[j]}'  
a[1]=cul                                                                                                                          
a[2]=de                                                                                                                           
a[3]=sac                                                                                                                          
seps[1]=-                                                                                                                         
seps[2]=-

2.4 others

pos = index(string, find)
len = length([string])

match(string, regexp [, array])

str = sprintf(format, expr-list)
num = strtonum(str)

tolower(str)
tolower(str)

$ awk 'BEGIN{print index("peanut", "an")}'                                                                                
3        

$ awk 'BEGIN{print length("peanut")}'                                                                                     
6    

# the older versions of awk, the length() function could be called without any parentheses, but forget it.                                                                                                                            
$ awk 'BEGIN{len=length "peanut"; print len}'                                                                             
0peanut

$ echo "foooobazbarrrrrr" | awk '{match($0, /(fo+).+(bar*)/, arr); print arr[1], arr[2]}'                                 
foooo barrrrrr

$ awk 'BEGIN{pi=sprintf("%.2f (approx.)", 22/7); print pi}'                                                                         
3.14 (approx.)   

$ awk 'BEGIN{s="0x11"; printf("%d\n", strtonum(s))}'                                                                    
17     

$ awk 'BEGIN{print toupper("cest la vie")}'                                                                               
CEST LA VIE                                                                                                                       
$ awk 'BEGIN{print tolower("Welcome You")}'                                                                               
welcome you      

3. IO

close(filename [, how]): “how” is “from” or “to”
fflush(filename)
system(command)

4. Time

mktime(“YYYY MM DD HH MM SS [DST]”)
strftime([format [, timestamp [, utc-flag] ] ])
systime(): the current time stamp since the system epoch

# default time format
$ awk 'BEGIN{print PROCINFO["strftime"]}'                                                                                                                          
%a %b %e %H:%M:%S %Z %Y 

$ awk 'BEGIN{print strftime()}'                                                                                                                                    
Mon Jul  6 09:29:13 EDT 2015

5. Bit-Manipulation

and(v1, v2 [, …])
or(v1, v2 [, …])
xor(v1, v2 [, …])
compl(val): the bitwise complement
lshift(val, count): shifted left by count bits
rshift(val, count): shifted right by count bits

$ cat bits2str.awk   
function bits2str(bits, data, mask)
{
    if (bits == 0)
        return "0"

    mask = 1;
    for (; bits != 0; bits = rshift(bits, 1))
        data = (and(bits, mask) ? "1" : "0") data

    while ((length(data) % 8) != 0)
        data = "0" data

    return data
}

BEGIN {
    printf "123 = %s\n", bits2str(123)
    printf "0123 = %s\n", bits2str(0123)
    printf "0x99 = %s\n", bits2str(0x99)
    comp = compl(0x99)
    printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
    shift = lshift(0x99, 2)
    printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
    shift = rshift(0x99, 2)
    printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
}

$ awk -f bits2str.awk                                                                                                                                               
123 = 01111011                                                                                                                                                            
0123 = 01010011                                                                                                                                                           
0x99 = 10011001                                                                                                                                                           
compl(0x99) = 0x1fffffffffff66 = 00011111111111111111111111111111111111111111111101100110                                                                                 
lshift(0x99, 2) = 0x264 = 0000001001100100                                                                                                                                
rshift(0x99, 2) = 0x26 = 00100110 

6. Data Type(gawk 4.0+)

isarray(x): distinguish an array from a scalar variable

$ awk 'BEGIN{a[1]="one"; print isarray(a)}'                                                                                                                         
1                

$ awk 'BEGIN{a="one"; print isarray(a)}'                                                                                                                            
0       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值