首页 > 其他分享 >(八)awk内置函数

(八)awk内置函数

时间:2023-05-31 23:00:57浏览次数:20  
标签:内置 函数 awkdir awk 数组 node1 root

算数函数,字符串函数,其它函数



算数函数

最常用的算数函数有rand函数、srand函数、int函数。
可以使用rand函数生成随机数,但是使用rand函数时,需要配合srand函数,否则rand函数返回的值将一直不变,示例如下。

[root@node1 awkdir]# awk 'BEGIN{print rand()}'
0.237788
[root@node1 awkdir]# awk 'BEGIN{print rand()}'
0.237788

可以看到,如果单纯的使用rand函数,生成的值是不变的,可以配合srand函数,生成一个大于0小于1的随机数,示例如下

[root@node1 awkdir]# awk 'BEGIN{srand();print rand()}'
0.869066
[root@node1 awkdir]# awk 'BEGIN{srand();print rand()}'
0.549335

可以看到,上图中生成的随机数都是小于1的小数,如果我们想要生成整数随机数,可以将上述生成的随机数乘以100,然后截取整数部分,使用int函数可以截取整数部分的值,示例如下

[root@node1 awkdir]# awk 'BEGIN{srand();print rand()}'
0.549335
[root@node1 awkdir]# awk 'BEGIN{srand();print 100*rand()}'
55.0438
[root@node1 awkdir]# awk 'BEGIN{srand();print int(100*rand())}'
38
[root@node1 awkdir]# awk 'BEGIN{srand();print int(100*rand())}'
31

经过上述处理以后,可以得到一个小于100的随机整数。



字符串函数

可以使用gsub函数或sub函数替换某些文本,先来 看看gsub函数怎样使用。
要将如下文本中的第一列中的小写字母"l"都替换成大写字母"L",则可以使用gsub函数,示例如下。

[root@node1 awkdir]# cat awktxt9
Hulk lisi
wanger mazi
liming	liudehua
[root@node1 awkdir]# awk '{gsub("l","L",$1)}' awktxt9
[root@node1 awkdir]# awk '{gsub("l","L",$1) ; print $0}' awktxt9
HuLk lisi
wanger mazi
Liming liudehua

如上图所示,我们使用gsub函数,将小写字母"l"替换成大写字母"L",但是替换的范围只限于"$1",所以,当我们再次输出文本时,发现只有文本中的第一列中的小写字母"l"被替换成了大写字母"L",其他列中的小写字母"l"并未被替换,当然,如果你想要替换文本中所有的小写字母"l",则可以将上图中的"$1"换成"$0",或者省略gsub函数中的第三个参数,省略gsub中的第三个参数时,默认为"$0",示例如下。

[root@node1 awkdir]# awk '{gsub("l","L",$0) ; print $0}' awktxt9
HuLk Lisi
wanger mazi
Liming Liudehua
[root@node1 awkdir]# awk '{gsub("l","L") ; print $0}' awktxt9
HuLk Lisi
wanger mazi
Liming Liudehua

看完上述示例,我想你应该已经明白了gsub函数的作用,没错,gsub函数会在指定范围内查找指定的字符,并将其替换为指定的字符串。
其实,我们还可以根据正则表达式,替换字符串,示例如下。

[root@node1 awkdir]# awk '{gsub("[a-z]","1",$0) ; print $0}' awktxt9
H111 1111
111111 1111
111111 11111111

好了,经过上述示例,你应该已经明白gsub的用法了。

那么sub函数与gsub函数有什么不同呢?我们来对比一下。

[root@node1 awkdir]# awk '{gsub("l","L") ; print $0}' awktxt9
HuLk Lisi
wanger mazi
Liming Liudehua
[root@node1 awkdir]# awk '{sub("l","L") ; print $0}' awktxt9
HuLk lisi
wanger mazi
Liming liudehua

当使用gsub函数时,gsub会替换指定范围内的所有符合条件的字符。
而使用sub函数则不同,当使用sub函数时,sub函数只会替换指定范围内第一次匹配到的符合条件的字符。
我们可以把gsub函数的作用理解为指定范围内的全局替换。
可以把sub函数的作用理解为指定范围内的单次替换,只替换第一次匹配到的字符。
这就是sub函数与gsub函数的为唯一的不同之处。

我们可以通过length函数,获取到指定字符串的长度,示例如下

[root@node1 awkdir]# awk '{for(i=1;i<=NF;i++) {print $i,length($i)}}' awktxt6
zhangsan 8
asdfasdf 8
sdfsalisi 9
sdfsadfsadf 11
asdfwangerpoipoi 16
sadfsadf 8
zhangsan 8
momlk 5
hello 5
nihao 5
sadfs 5
lisi 4
fsadf 5
werm 4
zhangsan 8
sdfsafmazi 10
adfdsa 6
wanger 6
sdfas 5

输出了文本中每个单词的长度,其实,length函数可以省略传入的参数,即不指定任何字符换,当省略参数时,默认使用"$0"作为参数,示例如下。

[root@node1 awkdir]# awk '{print $0,length()}' awktxt6
zhangsan asdfasdf 17
sdfsalisi sdfsadfsadf 21
asdfwangerpoipoi 16
sadfsadf zhangsan momlk 23
hello nihao 11
sadfs  lisi fsadf 17
werm zhangsan sdfsafmazi 24
adfdsa wanger sdfas 19

正如上图所示,我们使用length函数,获取到了文本中每一行的长度。

我们可以使用index函数,获取到指定字符位于整个字符串中的位置,示例如下

[root@node1 awkdir]# awk '{print index($0,"ni")}' awktxt6
0
0
0
0
7
0
0
0

上图中,我们使用index函数,在每一行中咋找字符串"Lee",如果Lee存在于当前行,则返回字符串Lee位于当前行的位置,如果Lee不存在于当前行,则返回0,表示当前行并不存在Lee,如上图所示,第二行中包含Lee,而且Lee位于第二行的第7个字符的位置,所以返回数字7。

在前文中,我们在总结数组时,提到过一个函数,借助这个函数可以动态的生成数组,而不用手动的设置数组中每个元素的值,没错,这个函数就是split函数。通过split函数,我们可以将指定的字符串按照指定的分割符切割,将切割后的每一段赋值到数组的元素中,从而动态的创建数组,示例如下。

[root@node1 awkdir]# awk -v ts="zhang:li:wang:liu:hu" 'BEGIN{split(ts,xing,":");for(i in xing){print xing[i]}}'
liu
hu
zhang
li
wang
split(ts,xing,":")

如上图所示,我们通过split函数,将字符串ts切割了,以":"作为分割符,将分割后的字符串保存到了名为huluwa的数组中,当我们输出数组中的元素时,每个元素的值为分割后的字符,其实,split函数也有对应的返回值,其返回值就是分割以后的数组长度,示例如下。

[root@node1 awkdir]# awk -v ts="zhang:li:wang:liu:hu" 'BEGIN{print split(ts,xing,":")}'
5

注意,被split函数分割后的数组的元素下标从1开始,不像其他语言中的数组下标是从0开始的,而且数组中元素输出的顺序可能与字符串中字符的顺序不同,原因在前文中已经说过了,如果我们想要按照顺序输出数组中的元素,可以使用如下方法。

[root@node1 awkdir]# awk -v ts="zhang:li:wang:liu:hu" 'BEGIN{split(ts,xing,":");for(i in xing){print xing[i]}}'
liu
hu
zhang
li
wang
[root@node1 awkdir]# awk -v ts="zhang:li:wang:liu:hu" 'BEGIN{arrLen=(split(ts,xing,":"));for (i=1;i<arrLen;i++){print i,xing[i]}}'
1 zhang
2 li
3 wang
4 liu

我们先使用了split函数生成了数组,并且将split的返回值保存在变量arrlen中,然后利用for循环中变量的递增,顺序的输出了数组中的对应下标以及元素值。



其他函数

我们还能够通过asort函数根据元素的值进行排序,但是,经过asort函数排序过后的数组的下标将会被重置,示例如下

[root@node1 awkdir]# awk 'BEGIN{t[1]=32;t[2]=9;t[3]=4;for(i in t){print i,t[i]}}'
1 32
2 9
3 4
[root@node1 awkdir]# awk 'BEGIN{t[1]=32;t[2]=9;t[3]=4;asort(t);for(i in t){print i,t[i]}}'
1 4
2 9
3 32
[root@node1 awkdir]# awk 'BEGIN{t["a"]=32;t["b"]=9;t["c"]=4;asort(t);for(i in t){print i,t[i]}}'
1 4
2 9
3 32

如上图所示,数组中元素的值均为数字,但是下标为自定义的字符串,通过asort函数对数组排序后,再次输出数组中的元素时,已经按照元素的值的大小进行了排序,但是,数组的下标也被重置为了纯数字,其实,asort还有一种用法,就是在对原数组元素值排序的同时,创建一个新的数组,将排序后的元素放置在新数组中,这样能够保持原数组不做任何改变,我们只要打印新数组中的元素值,即可输出排序后的元素值,示例如下。

[root@node1 awkdir]# awk 'BEGIN{t["a"]=32;t["b"]=9;t["c"]=4;asort(t,newt);for(i in t){print i,t[i]}}'
a 32
b 9
c 4
[root@node1 awkdir]# awk 'BEGIN{t["a"]=32;t["b"]=9;t["c"]=4;asort(t,newt);for(i in newt){print i,newt[i]}}'
1 4
2 9
3 32

其实,asort函数也有返回值,它的返回值就是数组的长度,换句话说,asort的返回值就是数组中元素的数量,示例如下。

[root@node1 awkdir]# awk 'BEGIN{t["a"]=32;t["b"]=9;t["c"]=4;len=asort(t);for(i=1;i<=len;i++){print i,t[i]}}'
1 4
2 9
3 32

使用asort 函数可以根据元素的值进行排序,而使用asorti 函数可以根据元素的下标进行排序。
当元素的下标为字符串时,我们可以使用asorti 函数,根据下标的字母顺序进行排序,当元素的下标为数字时,我们就没有必要使用函数排序了,直接使用for循环即可排序,所以,此刻我们只考虑数组的下标为字符串时,怎样通过asorti 函数根据下标对数组进行排序。

当数组的下标为字符串时,asorti 函数会根据原数组中的下标的字母顺序进行排序,并且将排序后的下标放置到一个新的数组中,并且asorti函数会返回新的数组的长度,示例如下

[root@node1 awkdir]# awk 'BEGIN{t["x"]=32;t["j"]=9;t["b"]=4;for(i in t){print i,t[i]}}'
j 9
x 32
b 4
[root@node1 awkdir]# awk 'BEGIN{t["x"]=32;t["j"]=9;t["b"]=4;len=asorti(t,new); for(i=1;i<=len;i++){print i,new[i]}}'
1 b
2 j
3 x

如上图所示,asorti 函数根据数组t的下标排序后,创建了一个新的数组new,new中元素的值即为t数组下标的值,上例中,我们使用len变量保存了asorti函数的返回值,并且输出了最后排序后的新数组。
将t数组的下标排序输出了,就根据排序后的下标再次输出对应的元素值,从而达到根据数组下标排序后,输出原数组元素的目的,示例如下。

[root@node1 awkdir]# awk 'BEGIN{t["x"]=32;t["j"]=9;t["b"]=4;len=asorti(t,new); for(i=1;i<=len;i++){print i,new[i]}}'
1 b
2 j
3 x
[root@node1 awkdir]# awk 'BEGIN{t["x"]=32;t["j"]=9;t["b"]=4;len=asorti(t,new); for(i=1;i<=len;i++){print i,new[i],t[new[i]]}}'
1 b 4
2 j 9
3 x 32

没错,上述过程,其实就是新数组负责排序老数组的下标,并将排序后的下标作为新数组的元素,而我们输出新数组元素的同时,又将新数组的元素值作为老数组下标,从而输出了老数组中的元素值。

标签:内置,函数,awkdir,awk,数组,node1,root
From: https://blog.51cto.com/lenglingx/6390840

相关文章

  • python内置库--logging
    关于logging利用logging,我们在代码里面输出日志信息,这些日志信息可以包括代码中的数据、日志所在模块/文件/行、记录时间、日志级别等等,这些信息可以判断代码运行状态、查看具体代码信息以帮助我们定位问题。在代码量大、模块多时,建议用logging来替代print,输出信息更加方便阅......
  • 递归函数
    聊聊递归函数和二分法递归函数什么是递归函数? """递归就是直接或者间接调用自己的函数就是递归函数"""递归函数的优点和缺点优点:-可以简化代码,使程序更加简洁。-可以解决一些复杂的问题,比如数学上的阶乘、斐波那契数列等。缺点:-可能会导致栈溢出,因为每次调用函......
  • linux 文本分析工具---awk命令
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有3个不同版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是AWK的GNU......
  • 取石子游戏与SG函数
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1848题意:有3堆石子,石子数量分别为a,b,c,有两个玩家,每次只能从任意一堆中取f个,这里的f只能为fibnacci数,问是先手胜还是先手败.分析:由于石子的数量都在1000以内,那么我们可以先预处理出1000以内的SG函数值,然后对于3堆石子,我......
  • HDU1524(博弈--有向无环图SG函数)
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输.分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值......
  • Python中的join()函数和split()函数的用法
    题目:CFUltra-FastMathematician 题意:给两个长度相等的0,1字符串,在相同的位置的两个字符不同就输出1,否则输出0.比如:10101000100101就输出:1110001代码:print''.join("10"[i==j]fori,jinzip(raw_input(),raw_input()))join()函数的用法就是把一个list中所有的串按照你定义的分隔......
  • POJ2154(Pólya定理与欧拉函数优化)
    题目:Color 题意:将正n边形的n个顶点用n种颜色染色,问有多少种方案(答案modp,且可由旋转互相得到的算一种) 先说说Pólya定理设Q是n个对象的一个置换群,用m种颜色涂染这n个对象,一个对象涂任意一种颜色,则在Q作用下不等价的方案数为:   |Q|为置换群中置换的个数,为将置换q表示成不相杂......
  • 函数式编程和java
    函数式编程和java在计算机科学中,函数式编程是一种编程范式,通过应用和组合函数来构建程序。它是一种声明式编程范式(对应命令式编程),其中函数定义是将数值映射到其他数值的表达式树,而不是更新程序运行状态的命令式语句序列。函数的定义数学上的函数是自变量到因变量的映射关系,......
  • 聊聊CSS 缓动函数的新成员linear()
    CSS缓动函数是一种用于控制CSS动画过渡效果的函数,可以让动画变得更加自然。这篇文章将介绍一种新的CSSeasingfunction,即linear(),它可以模拟出更复杂的缓动效果,文中demo请在chrome113+中观看。什么是easingfunction?在动画中,有一种叫做“缓动效果”的技术,它可以让动画变......
  • Pytest - Fixture(11) - 重命名fixture函数名称(name)
    Pytest-重命名fixture函数名称(name)fixture设置参数name=value后,可以重命名fixture函数名称,运行时传入重命名后的fixture函数名即可。使用重命名的fixture函数,可以使用装饰器:@pytest.mark.usefixtures();importpytest#编写[email protected](name="open_br......