首页 > 其他 > 详细

awk的gsub函数

时间:2021-03-31 16:23:26      阅读:39      评论:0      收藏:0      [点我收藏+]

一.遇到的问题:

问题:echo "a b c 2011-11-22 a:d" | awk ‘$4=gsub(/-/,"",$4)‘为啥 输出后 2011-11-22 变成 2 了?

解答:
gsub(/-/,"",$4)的值是2【 在赋值的情况下是这样的~】,你将2赋值给$4 , gsub返回的是替换的次数
如下是测试结果:

[root@Test230 ~]# echo "a b c 2011-11-22 a:d" | awk $4=gsub(/-/,"",$4)
a b c 2 a:d

 

看另一种情况,只是替换的话~

[root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk gsub(/-/,"",$4)
a b c 20111122 a:d
[root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk gsub(/-/,"_",$4)
a b c 2011_11_22 a:d

 

二.实例详解

下面我们来总结一下这个gsub的用法:

有一个文本文件data.test的内容如下:

0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf


以‘|‘为分隔, 现要将第二个域字母前的数字去掉,其他地方都不变, 输出为:

0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf


解法:

awk -F | BEGIN{ OFS="|" } {sub(/[0-9]+/,"",$2);print $0} data.test 

awk -F | -v OFS=| {sub(/[0-9]+/,"",$2);print $0} data.test 

 

其实不加那个输出域符也可以:

awk -F |  {sub(/[0-9]+/,"",$2);print $0} data.test 

 


三.sub和gsub的区别

sub匹配第一次出现的符合模式的字符串,相当于 sed ‘s//‘   。
gsub匹配所有的符合模式的字符串,相当于 sed ‘s//g‘   。
例如:
awk ‘{sub(/Mac/,"Macintosh");print}‘ urfile    用Macintosh替换Mac
awk ‘{sub(/Mac/,"MacIntosh",$1); print}‘ file    第一个域内用Macintosh替换Mac
把上面sub换成gsub就表示在满足条件得域里面替换所有的字符。
awk的sub函数用法:
sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。
如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:

sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)

 


实例:

$ awk { sub(/test/, "mytest"); print } testfile
$ awk { sub(/test/, "mytest", $1); print } testfile


      第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。
      第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。
如要在整个文件中进行匹配需要用到gsub
gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)

 

实例:

$ awk { gsub(/test/, "mytest"); print } testfile
$ awk { gsub(/test/, "mytest", $1); print } testfile


      第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
      第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
另外, 只有当记录中的域有改变的时候 ,指定0FS变量才有用, 如果记录中的域无变化, 指定OFS产生不了实际效果。

awk -F| -v OFS=| { gsub(/[0-9]/, "", $3); print $0; } data.txt   

 

将把第三个域中所有数字都去掉。

另外,对于数字的匹配,可以使用十六进制。

awk -F| -v OFS=| { gsub(/[/x30-/x39]/, "", $3); print $0; } data.txt

 

awk的gsub函数

原文:https://www.cnblogs.com/cangqinglang/p/14600897.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!