关于awk语法问题
发布网友
发布时间:2022-04-26 20:58
我来回答
共1个回答
热心网友
时间:2023-11-01 13:30
a被开成了一个数组,第一列有多少不同的值,a就有多少个元素,元素的个数是随着一行行处理下来动态增长的,a[$1]就是说“如果已经有这个串,a[$1]就不是缺省的初始值0,如果没有,就相当于增加一个元素,其初始值是0”,在这个逻辑中,自动地实现了按照第一列分组的意图。
awk脚本的大致框架如下:
BEGIN {...}——开始处理前,做些准备工作
{...}——花括号中的是处理语句,每读取一行文本,就处理一趟。
END {...}——所有的行都处理后,最终来一趟处理,一般的统计工作常在这里进行
NF是当前行的列数,列是按照某分隔串将行拆解出来的,缺省的分隔符是TAB和空格;$NF就是该行的最后一列;
arr同样是开数组,++是递增数值,++x相当于x=x+1;一行行的++arr[$NF]进行下来,逻辑就是按照各行的最后一列分组统计,最后的END逻辑就是输出不同的最后一列,以及出现的频度。
以上为鱼,建议你找一本叫做“Effective Awk Programming, 3rd Edition”的书看看,掌握渔技。追问我真的很感谢你这么详细的回答、我收获不小、但是还有一定没有明白、第一个例子里、a[$1]=a[$1]+$2、那a[$1]这时候的值是多少、还有如果第一列相同、第二列是在那个地方加起来的、最好一句一句的说、把中间每一步的值也说出来、我知道我的问题很叼怪、但是非常感谢、、、、
追答任何数值型变量缺省值都是0,数组也不例外。
a[$1]=a[$1]+$2的分解动作:
1、看看有没有a数组,没有就创建一个
2、看看a数组中有没有$1(当前行的第一列)的元素,没有就创建一个,发现后面正在进行+操作,则认定它是个数值型,于是设定初始值为0
3、如果有$1,取出当前值(当第一列首次出现时为0,否则应该已经是个累加值),加上$2的数儿
热心网友
时间:2023-11-01 13:30
a被开成了一个数组,第一列有多少不同的值,a就有多少个元素,元素的个数是随着一行行处理下来动态增长的,a[$1]就是说“如果已经有这个串,a[$1]就不是缺省的初始值0,如果没有,就相当于增加一个元素,其初始值是0”,在这个逻辑中,自动地实现了按照第一列分组的意图。
awk脚本的大致框架如下:
BEGIN {...}——开始处理前,做些准备工作
{...}——花括号中的是处理语句,每读取一行文本,就处理一趟。
END {...}——所有的行都处理后,最终来一趟处理,一般的统计工作常在这里进行
NF是当前行的列数,列是按照某分隔串将行拆解出来的,缺省的分隔符是TAB和空格;$NF就是该行的最后一列;
arr同样是开数组,++是递增数值,++x相当于x=x+1;一行行的++arr[$NF]进行下来,逻辑就是按照各行的最后一列分组统计,最后的END逻辑就是输出不同的最后一列,以及出现的频度。
以上为鱼,建议你找一本叫做“Effective Awk Programming, 3rd Edition”的书看看,掌握渔技。追问我真的很感谢你这么详细的回答、我收获不小、但是还有一定没有明白、第一个例子里、a[$1]=a[$1]+$2、那a[$1]这时候的值是多少、还有如果第一列相同、第二列是在那个地方加起来的、最好一句一句的说、把中间每一步的值也说出来、我知道我的问题很叼怪、但是非常感谢、、、、
追答任何数值型变量缺省值都是0,数组也不例外。
a[$1]=a[$1]+$2的分解动作:
1、看看有没有a数组,没有就创建一个
2、看看a数组中有没有$1(当前行的第一列)的元素,没有就创建一个,发现后面正在进行+操作,则认定它是个数值型,于是设定初始值为0
3、如果有$1,取出当前值(当第一列首次出现时为0,否则应该已经是个累加值),加上$2的数儿