整理的awk的小技巧

begin是要放在正则前面的,按照这个顺序:

awk 'begin{} /.*?/ {action}end{}' file

FS=':' 和 -F: 是等同的

-F 表示以 XX为分隔符,那如果想要多个分隔呢?看实例:

$ cat tmp
ss>asdasd>hehe>asd
where are you are my
where are> you> are my $ awk -F '(>|are)' '{print $3}' tmp
hehe
my
you

可以看到,这里的分隔符是 >  或者是 are ,通过第3个例子可以发现,只要句子中出现这两个词,都会作为分隔,所以才出现了you 。

for循环和便利数组,

for(i=;i<;i++)print i,ENVIRON[i] 

或者

 for(i in ARGV){print i,ARGV[i]}

匹配正则表达式

if(a ~ /^*/)

不匹配

if(a ~! /^*/)

多文件操作,重点学习一下:

dahu@dahu-OptiPlex-:~/myfile$ awk 'FNR==1{print "\r\n"FILENAME}{print $0}' a.txt b.txt  

a.txt
100 wang man
200 wangsan woman
300 wangming man
400 wangzheng man

b.txt
100 90 80
200 80 70
300 60 50
400 70 20

看下回显信息,FNR==1相当于一个条件用法,在第一行显示文件名,这个用法可以。类似的,我可以第二行/第三行显示

dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{info="it is a test";tlen=split(info,a," ");for(i in a){print tlen,i"\t"a[i]};}'

这句话tlen=split(info,a," "),tlen=4,因为分割成4个部分了,类似于len的用法

dahu@dahu-OptiPlex-3046:~/myfile$ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'

删除数组键值的方法,直接delete

二维数组的用法:

awk 'BEGIN{print">>>>>";
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
tarr[i,j]=i*j;
}
}
for(m in tarr)
{ split(m,tarr2,SUBSEP);             #split(数据源,新的数组,分割符)
print tarr2[],"*",tarr2[],"=",tarr[m];   #二维数组从刚生成的新数组里面获取
}
}'

显示文件的内容按照排序来显示

dahu@dahu-OptiPlex-:~/myfile$ cat b.txt | sort -nk3

两文件合并,借助next实现

[chengmo@centos5 shell]$  cat a.txt b.txt | sort -n -k1 |awk  'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}' 

也可以直接编程来实现:

awk '
BEGIN{print ">>>>>\nconnect a.txt & b.txt";
if(ARGC<)
{
exit ;
}
file="";
}
{
aData[FILENAME,$]=ARGV[]==FILENAME?$:$"\t"$;    #条件判断式,要么整行,要么第二行第三行,和文件名对应
}
END{
for(k in aData)
{
split(k,idx,SUBSEP);                   #idx是aData的下标,k就是FILENAME和idx[]
if (idx[]==ARGV[] && (ARGV[],idx[])in aData)
{
print aData[ARGV[],idx[]],aData[ARGV[],idx[]] | "sort -nrk1"   #这里要加上引号的??
}
}
}' a.txt b.txt

awk正则表达式

  • awk内置使用正则表达式函数

gsub( Ere, Repl, [ In ] )

sub( Ere, Repl, [ In ] )

match( String, Ere )

split( String, A, [Ere] )

EPRs类型。一些结合类型表示符没有了:包括:”\d,\D,\s,\S,\t,\v,\n,\f,\r”

常用: /[0-9]+/

常用内置函数

gsub,sub使用  sub是只替换第一个,gsub是全部替换,函数返回值是替换的个数
[chengmo@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test! 在 info中查找满足正则表达式,/[-]+/ 用””替换,并且替换后的值,赋值给info 未给info值,默认是$ 查找字符串(index使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok 未找到,返回0 正则表达式匹配查找(match使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok 截取字符串(substr使用) [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes 从第 4个 字符开始,截取10个长度字符串 字符串分割(split使用) [chengmo@centos5 ~]$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' test
this
is
a 分割info,动态创建数组tA,这里比较有意思,awk for …in 循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。

getline:awk里,从文件中读取变量到awk中

dahu@dahu-OptiPlex-:~/myfile$ awk 'BEGIN{while("cat car"|getline){print $1;};close("/car")}'

或者

dahu@dahu-OptiPlex-:~/myfile$ awk 'BEGIN{while(getline < "car"){print $1;};close("car")}'

这样就可以实现获取本地文件的功能了

同样的,也可以在脚本里面讲数据写入文件:

awk 'BEGIN{print "hehe"}' > hehe.txt

简单快速数字转汉字:

$ awk 'BEGIN{ORS="";a="零一二三四五六七八九";for(i=0;i<10;i++){arr[i]=substr(a,i+1,1)};b=345;for(j=1;j<=length(b);j++)
{c=substr(b,j,1);print arr[c]};print "\n" }'
三四五

也可以处理文件

$ awk 'BEGIN{ORS="";a="零一二三四五六七八九";for(i=0;i<10;i++){arr[i]=substr(a,i+1,1)}}
{for(j=;j<=length($);j++){c=substr($,j,);print arr[c]};print "\n" }' text
一三四
一三五
一三六
一三七

awk进阶的更多相关文章

  1. 第10章:awk进阶操作

    第10章:awk进阶操作 在第4章:查找与替换简单的讲解了awk的使用,本章介绍详细讲解awk的使用.awk是一个强大的文本分析工具,简单的说awk就是把文件逐行的读入, 以空格为默认分隔符将每行切片 ...

  2. linux awk进阶篇

    上一篇主要是awk的进本应用.本节是awk的进阶篇 ACTION:除去常用的print和printf还有以下几个 expression:表达式 如$1>3 control statements: ...

  3. awk进阶整理

    BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译.为了能理清awk工具使用的思路,详情还要看awk说明书(man awk) 或者http://www.gnu.org/software/g ...

  4. LeetCode(194.Transpose File)(awk进阶)

    194. Transpose File Given a text file file.txt, transpose its content. You may assume that each row ...

  5. awk 进阶,百万行文件取交集

    今天我们说的不是简单的交集,而是如下示例: file1: as,er,gf,1212kl,iop,121378,jkl,uio,jki,1214vbnm,yuoi,678i,1215sadfasdf, ...

  6. shell编程awk进阶

    awk操作符 算术操作符:  x+y, x-y, x*y, x/y, x^y, x%y      -x: 转换为负数      +x: 转换为数值 字符串操作符:没有符号的操作符,字符串连接 赋值操作 ...

  7. Linux三剑客之awk精讲(基础与进阶)

    第1章 awk基础入门 要弄懂awk程序,必须熟悉了解这个工具的规则.本实战笔记的目的是通过实际案例或面试题带同学们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册. 1.1 awk简介 一种 ...

  8. 【Linux进阶】使用grep、find、sed以及awk进行文本操作

    目录 一.元字符 二.grep命令 1. 过滤出包含某字符串的行 2. 过滤出以某字符串开头(结尾)的行 3. 过滤出包含某字符串及其相邻的行 4. 过滤出不包含某关键字的行 5. 过滤出包含多个字符 ...

  9. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

随机推荐

  1. eclipse中配置jbpm3.2插件

    1.什么是jbpm?为什么要使用jbpm呢? 通俗一点讲,jbpm是一个负责管理工作流的一个产品,那么什么是工作流呢,所谓的工作流就是在办公自动化系统中,提交申请,申请经过多个部门领导审批,完成该流程 ...

  2. Struts2-从值栈中获取数据-EL表达式从值栈获取

    从值栈获取数据 1 使用struts2的标签+ognl表达式获取值栈数据 (1)<s:property value=”ognl表达式”/> 获取字符串

  3. 对于redis底层框架的理解(一)

    近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initser ...

  4. python 深、浅拷贝

    Python的数据结构总体分为两类: 1.字符串和数字 2.列表.元组.字典等 一.字符串和数字 对于字符串和数字而言,赋值(=).浅拷贝(copy)和深拷贝(deepcopy)其实都没有意义,因为它 ...

  5. [DeeplearningAI笔记]卷积神经网络1.4-1.5Padding与卷积步长

    4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.4Padding 一张\(6*6\)大小的图片,使用\(3*3\)的卷积核设定步长为1,经过卷积操作后得到一个\(4*4 ...

  6. dva 笔记

    最简单的结构 // 创建应用 const app = dva(); // 注册 Model app.model({ namespace: 'count', state: 0, reducers: { ...

  7. ACM选修HUST1058(市赛题) Lucky Sequence 同余定理

    Description Edward  得到了一个长度为  N  的整数序列,他想找出这里面有多少个“幸运的”连续子序列.一个连续子序列被称为“幸运的”,当且仅当该子序列内的整数之和恰好是  K  的 ...

  8. Python输出字符串或文件颜色显示

    书写格式,和相关说明如下: 格式:\033[显示方式;前景色;背景色m 说明: 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 ...

  9. ② 设计模式的艺术-02.简单工厂(Simple Factory)模式

    工厂模式 实现了创建者和调用者的分离. 详细分类:简单工厂模式.工厂方法模式.抽象工厂模式 面向对象设计的基本原则 OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对 ...

  10. 使用JavaScript实现使用鼠标画线的效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...