awk脚本处理数据

转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/80929741

 

我们可以在本机电脑上编辑awk脚本,再放上linux系统上运行。

首先,创建awk脚本。我们可以新建文本文件,再改名,如test.awk。用记事本或其他顺手的软件打开此文件。

开头一般都是:

#! /usr/bin/awk -f

这行是为了在运行脚本时候,知道去哪里找awk编译器(可能表述不太准确)。也可以理解为表明身份(我来了,我是谁?awk。那我找谁运行我?去这个路径——/usr/bin/awk)

代码里类似C语言。一般的,第一行下面,写自定义函数,类等。我是把所有自定义函数都写完后再写的awk主体部分。可展示下我的一个自定义函数。

function jd(    zf){

if(length(zf)==11&&substr(zf,5,1)!="."){
return substr(zf,1,4)"."substr(zf,5,11);
}
else if(length(zf)==10&&substr(zf,4,1)!="."){
return substr(zf,1,3)"."substr(zf,4,11);
}
else return zf;

};

因为自定义函数多了,各种变量也会很多,容易重名冲突,而awk没有C语言那样自动分别全局变量还是局域变量。我为此排查故障费了好多精力和时间,终于找到了能用的解决办法。

function是自定义函数声明,jd是我自定义函数名。zf是我自定义函数的参数。为什么zf前面放一些空格呢?这可是我故意的,可不是因为我编码习惯不好,也不是我手误打的。zf前加些空格(我加3个,你们随意。文学上3泛指多数。除了0/1/2其他的一般都是3了。),可以表明zf是形参,这里的zf不会被这个自定义函数外的地方见到并使用。(这点也是很关键的,比如我多个自定义函数,少不了用到for循环,变量名容易冲突。加了空格,好多了。)

if和else语句之间不可加分号,其他语句,可加可不加,同行的不同语句之间必须分号隔开。所以行末的分号,习惯python的可不加,习惯C的可加。

substr(zf,4,2)意思是,zf这个字符串的第4个字符开始取2个字符。如zf=“12345678”,那么substr(zf,4,2)就是“45”。这个注意和其他语言做个区分,因为有的语言规定字符串第一个的序号是0。

awk是根据读取文件的数据流走的,所以处理数据是以读取文件的行为单位。目前本人的水平是根据这个处理的,至于其他的快捷高效的编码方式,如有大神看到此文,请附注相关信息和链接,鄙人自当三人行必有吾师,好好向大神学习以进步。

开头和自定义函数写完后,就是awk的三部分了。开头、正文、结尾。

开头就是在处理数据前做的准备工作。请看以下代码:

BEGIN {
	FS="," ;
	OFS="," ;
	#print "done";
	to3=0;to1=0;to2=0;to4=0;
	#print ssj("\"2018/7/6 12:23:36\"");
};

以上就是开头的代码块——BEGIN{};    FS指的是读取文件的时候,以,为分隔符。OFS自然是指的输出文件以,为分隔符。所以如果你要举一反三的话,希望输出文件是用|来作为分隔符,那么你就应该写OFS="|"。to3等是定义的变量,注意此处必须是分号,逗号无效。诸位看官可自行测试。为何定义这些变量,我是为了后面的统计。比如读取的文件是多少行,其中有多少行是A内容,多少是B,多少C……#是注释行,代表这行代码只供阅读,不执行。若不懂注释行,请自行了解注释行是什么意思。之所以这里有注释行,是因为我有时候不确定相应代码是否可以达到预期效果,所以有时候会去掉#,让其输出显示相关内容以供分析。比如#print "done",我看到done可知,begin这块代码执行了。编码时候有些细节没注意会遇到不一样的结果,这个也是一个初级的调试,如果你想问我高级调试怎么做,如果你知道的话,请告诉我,我还没找到这块的知识(本人能力有限,所以我不知道的东西是一些大牛们的一碟小菜的可能性是很大的。ps:因为本人能力有限,所以可能性是很大的。什么的可能性?东西是一碟小菜的可能性。什么东西?我不知道的东西。什么一碟小菜,一些大牛们的一碟小菜。如果还不理解这句话,我直接告诉你:我很菜,玩的是大牛们认为很简单的小儿科的事情。如果还不懂,请重修小学语文吧)。

言归正传,正文是什么呢?很简单,就是{}。大括号之间的代码块,就是正文。每读取文件的一行,这些代码执行一次。如果你的正文代码快是这样的:

{
    print "是我,是我"
}

你读取的文件有多少行,你就会得到多少遍这段字符。

结尾代码块

END{
	print "ti",to1,"qu",to2,"kong",to3,"sum",to1+to2+to3,NR;
	#for(   i=1;i<=le;i++){
	#		print a[i]>"jg.csv";
	#	}
}

结尾代码块就是读取文件所有行后的收尾工作。这些变量,就是在begin里定义的。注释部分是输出数组。print a>"jg.csv"就会把数组输出到这个csv文件里。如果是两个,即>>,代表追加到这个文件,一个当然就是这个csv文件里有且只有这个数组的内容。输出到文件,一定要双引号裹起来,我之前不知道,怎么也不能实现输出,费了几天时间和精力才找到解决办法,哈,原来就这么 简单啊。对呀,就这么简单,只不过你不知道,就得投入很多精力和时间。这也是一个经验。我也是找了好久自己发现的。所以有时候多看人家写的代码多思考。这里表个态:对于那些只知道摘抄而不思考的,表示不欢迎、不喜欢。就好像问路一样,我说到某个地方过天桥到对面就可以了,我们的目的是去路对面,你可以走天桥、人行横道、也可以地下通道,千万可别非要走天桥,如果哪天天桥被拆了,希望你也找找人行横道和地下通道啊。

脚本写完了,怎么运行。这也是一个关键的事情。

linux的命令行,输入一下代码:

awk -f test.awk

这就是执行linux命令行当前路径内的test.awk。这个只是单纯的执行这个awk脚本,那么处理哪个数据啊?请看大屏幕。大屏幕没有看你的电脑屏幕,看下面(此处的下面)。

awk -f test.awk a.csv

此所谓处理数据以吾所编制之awk脚本也。这句话不理解的去继承下我们优良的中华传统文化吧。

班门弄斧,以飨后来之读者。

 

独孤尚良dugushangliang——著

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值