awk使用内置函数

1. 一个奇怪的rand()

   [root@hadoop ~]# awk '{fr=int(100*rand());print fr}' tour.txt
23
29
84
15
58
19
81
17

如果加入srand();

[root@hadoop ~]# awk '{srand();fr=int(100*rand());print fr}' tour.txt
59
59
59
59
59
59
59
59

2.gsub 和sub

[root@hadoop ~]# awk '{go="this is 2019!";gsub(/[0-9]/,"*");sub("this","that",go);print $0,":",go}' tour.txt
air:**;hotel:**;nation:CHINA : that is 2019!
air:**;hotel:**;nation:USA : that is 2019!
air:**;hotel:**;nation:USA : that is 2019!
air:**;hotel:**;nation:CHINA : that is 2019!
air:**;hotel:**;nation:USA : that is 2019!
air:**;hotel:**;nation:USA : that is 2019!
air:**;hotel:**;nation:CHINA : that is 2019!
air:**;hotel:**;nation:CHINA : that is 2019!

3. index

[root@hadoop ~]# awk '{po=index($0,"air");print po,$0}' tour.txt
1 air:23;hotel:34;nation:CHINA
1 air:35;hotel:46;nation:USA
1 air:36;hotel:47;nation:USA
1 air:26;hotel:37;nation:CHINA
1 air:33;hotel:44;nation:USA
1 air:34;hotel:45;nation:USA
1 air:25;hotel:36;nation:CHINA
1 air:24;hotel:35;nation:CHINA

index的开始编号为1,找不到返回0


4. match 匹配

[root@hadoop ~]# awk '{po=match($0,/[0-9]/);print po,$0}' tour.txt
5 air:23;hotel:34;nation:CHINA
5 air:35;hotel:46;nation:USA
5 air:36;hotel:47;nation:USA
5 air:26;hotel:37;nation:CHINA
5 air:33;hotel:44;nation:USA
5 air:34;hotel:45;nation:USA
5 air:25;hotel:36;nation:CHINA
5 air:24;hotel:35;nation:CHINA

match同样以1为开始编号,只返回第一个匹配值


5. blength (字节)和length(字符)

   [root@hadoop ~]# awk '{l=length;bl=blength;print l,";",bl,";",$0}' tour.txt
28 ;  ; air:23;hotel:34;nation:CHINA
26 ;  ; air:35;hotel:46;nation:USA
26 ;  ; air:36;hotel:47;nation:USA
28 ;  ; air:26;hotel:37;nation:CHINA
26 ;  ; air:33;hotel:44;nation:USA
26 ;  ; air:34;hotel:45;nation:USA
28 ;  ; air:25;hotel:36;nation:CHINA
28 ;  ; air:24;hotel:35;nation:CHINA

6. sbstr

[root@hadoop ~]# awk '{su=substr($0,3,5);print su}' tour.txt
r:23;
r:35;
r:36;
r:26;
r:33;
r:34;
r:25;
r:24;


7.split

[root@hadoop ~]# awk 'BEGIN{go="my name is wei hong rao";split(go,names," ");for( i in names) {print names[i]}}'
wei
hong
rao
my
name
is

由上可见一个思之玩味的现象:

for in 出来的东西是无序的,可以用另一种循环令他有序

[root@hadoop ~]# awk 'BEGIN{go="my name is wei hong rao";split(go,names," ");for(i=1; i<=length( names);i++) {print names[i]}}'
my
name
is
wei
hong
rao

8. getline

[root@hadoop ~]# awk 'BEGIN{while("cat tour.txt"|getline){print $0}}'
air:23;hotel:34;nation:CHINA
air:35;hotel:46;nation:USA
air:36;hotel:47;nation:USA
air:26;hotel:37;nation:CHINA
air:33;hotel:44;nation:USA
air:34;hotel:45;nation:USA
air:25;hotel:36;nation:CHINA
air:24;hotel:35;nation:CHINA
[root@hadoop ~]# awk 'BEGIN{while(getline< "tour.txt"){print $0}}'
air:23;hotel:34;nation:CHINA
air:35;hotel:46;nation:USA
air:36;hotel:47;nation:USA
air:26;hotel:37;nation:CHINA
air:33;hotel:44;nation:USA
air:34;hotel:45;nation:USA
air:25;hotel:36;nation:CHINA
air:24;hotel:35;nation:CHINA

[root@hadoop ~]# awk 'BEGIN{while("ls"|getline){print $0}}'
anaconda-ks.cfg
a.txt
derby.log
Desktop
Documents
Downloads
install.log
install.log.syslog


[root@hadoop usr]# head -n 3 a.txt
AIR     2013-09-01      4403    1348662.0
AIR     2013-09-02      26449   6701268.0
AIR     2013-09-03      45262   1.3755425E7
[root@hadoop usr]# head -n 3 b.txt
AIR 23
AIR 29
AIR 84

想要根据b.txt 来匹配a.txt里的行,但是如果下面没有close的话在循环中只会取到b.txt中的第一行
 awk '{while(getline line < "b.txt"){print $0" "line};close("b.txt")}' a.txt



9.使用system

[root@hadoop ~]# awk 'BEGIN{files=system("ls");print files}'
anaconda-ks.cfg  install.log         ok          test       tour.txt
a.txt            install.log.syslog  ok2         test1      Videos
derby.log        mapper.sh           Pictures    test2      workspace
Desktop          metastore_db        Public      tour2.txt
Documents        Music               reducer.sh  tour3.txt
Downloads        newtour.txt         Templates   tour4.txt
0


10.日期

[root@hadoop ~]# awk 'BEGIN{D=systime();print d}'

[root@hadoop ~]# awk 'BEGIN{d=systime();print d}'
1378355219
[root@hadoop ~]# awk 'BEGIN{d=systime();print strftime("%D",d)}'
09/05/13
[root@hadoop ~]# awk 'BEGIN{d=systime();print strftime("%D",mktime(2013 09 05 12 20 20))}'
12/31/69



awk是一种用于文本处理的强大工具,它具有许多内置函数可用于处理和操作文本数据。以下是一些常用的Awk内置函数及其用法: 1. length(string): 返回字符串string的长度。 示例:length("Hello World")返回11。 2. substr(string, start, length): 返回从字符串string的start位置开始长度为length的子字符串。 示例:substr("Hello World", 7, 5)返回"World"。 3. index(string, substring): 返回字符串string中子字符串substring第一次出现的位置(从1开始计数)。 示例:index("Hello World", "World")返回7。 4. split(string, array, separator): 将字符串string按照分隔符separator拆分成多个子字符串,并存储在数组array中,返回拆分后的子字符串个数。 示例:split("apple,banana,orange", fruits, ",")将字符串拆分成3个子字符串,并存储在数组fruits中。 5. tolower(string): 将字符串string转换为小写字母,并返回转换后的字符串。 示例:tolower("Hello World")返回"hello world"。 6. toupper(string): 将字符串string转换为大写字母,并返回转换后的字符串。 示例:toupper("Hello World")返回"HELLO WORLD"。 7. sprintf(format, expression1, expression2, ...): 根据指定的格式(format)将表达式(expression1, expression2, ...)格式化为字符串。 示例:sprintf("%.2f", 3.14159)返回"3.14"。 这些只是Awk内置函数的一小部分,还有许多其他函数可用于不同的文本处理任务。你可以根据具体需求查阅Awk官方文档以获取更详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值