Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1454885
  • 博文数量: 263
  • 博客积分: 10851
  • 博客等级: 上将
  • 技术积分: 2627
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-26 22:40
文章分类

全部博文(263)

文章存档

2013年(4)

2012年(25)

2011年(33)

2010年(50)

2009年(138)

2008年(13)

分类: LINUX

2008-12-09 23:30:11

有一文本:
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]+/,"",$3);print $0}' data_file
awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$3);print $0}' data_file
 
其他方法:
 

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
阅读(3353) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~