awk的内置函数大致可以分类为算数函数、字符串函数、时间函数、其他函数等
算数函数
最常用的算数函数有rand函数、srand函数、int函数。
可以使用rand函数生成随机数,但是使用rand函数时,需要配合srand函数,否则rand函数返回的值将一直不变
ghostwu@dev:~/linux/awk$ awk 'BEGIN { print rand(); }'
0.237788
ghostwu@dev:~/linux/awk$ awk 'BEGIN { print rand(); }'
0.237788
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }'
0.543596
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }'
0.524347
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }'
0.235681
用int函数取整
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print 10 * rand(); }'
7.83585
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print 10 * rand(); }'
8.53695
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }' ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }' ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }'
字符串函数
gsub函数或sub函数替换指定文本字符串
1,不指定第三个参数,默认替换整行中匹配的字符串
ghostwu@dev:~/linux/awk$ awk '{ gsub( "n", "N" ); print }' ghostwu.txt
ghostwu maN
zhaNgsaN
lisi
ghostwu maN
zhaNzhao maN
peter maN
zhaNzhao maN
ghostwu@dev:~/linux/awk$ cat ghostwu.txt
ghostwu man
zhangsan
lisi
ghostwu man
zhanzhao man
peter man
zhanzhao man
2,可以指定第三个参数,替换指定的范围,如第一列
ghostwu@dev:~/linux/awk$ awk '{ gsub( "n", "N", $1 ); print }' ghostwu.txt
ghostwu man
zhaNgsaN
lisi
ghostwu man
zhaNzhao man
peter man
zhaNzhao man
还可以支持正则表达式
ghostwu@dev:~/linux/awk$ awk '{ gsub( "[a-z]", "G", $1 ); print }' ghostwu.txt
GGGGGGG man
GGGGGGGG
GGGG
GGGGGGG man
GGGGGGGG man
GGGGG man
GGGGGGGG man
sub替换的是第一次出现的字符串
ghostwu@dev:~/linux/awk$ awk '{ sub( "n", "N" ); print }' ghostwu.txt ghostwu maN
zhaNgsan
lisi
ghostwu maN
zhaNzhao man
peter maN
zhaNzhao man
length:获取每一行文本的长度
ghostwu@dev:~/linux/awk$ awk '{ print $0, length() }' ghostwu.txt
ghostwu man
zhangsan
lisi
ghostwu man
zhanzhao man
peter man
zhanzhao man
index: 获取字符串的位置,没有该字符串,就是0
ghostwu@dev:~/linux/awk$ awk '{print $0, index( $0, "n" )}' ghostwu.txt
ghostwu man
zhangsan
lisi
ghostwu man
zhanzhao man
peter man
zhanzhao man
split:字符串切割成数组,每行切割的结果存储在数组arr中,返回值为数组的长度
ghostwu@dev:~/linux/awk$ awk '{ len = split( $0, arr, " " ); for ( i in arr ) { print i, arr[i], len } }' ghostwu.txt
ghostwu man
zhangsan lisi
ghostwu man
zhanzhao man
peter man
zhanzhao man
ghostwu@dev:~/linux/awk$ cat ghostwu.txt
ghostwu man
zhangsan
lisi
ghostwu man
zhanzhao man
peter man
zhanzhao man
asort:把数组的值从小到大排序,但是索引也发生改变了
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; for( i in arr ) { print i, arr[i] } }'
a
b
c
d
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr ); for( i in arr ) { print i, arr[i] } }'
可以是用第二个参数 用来保存原数组排序后的结果,同时原数组保持不变
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr, newarr ); for( i in newarr ) { print i, newarr[i] } }' ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr, newarr ); for( i in arr ) { print i, arr[i] } }'
a
b
c
d
asort的返回值为数组中的元素个数
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; len = asort( arr, newarr ); for( i in arr ) { print len, i, arr[i] } }'
a
b
c
d
当数组的下标为字符串时,asorti 函数会根据原数组中的下标的字母顺序进行排序