zoukankan      html  css  js  c++  java
  • awk数组与语法

    1、awk数组

    1.1 数组结构

    1.2 数组分类

    引数组:以数字为下标

    关联数组:以字符串为下标

    1.3 awk关联数组

    现有如下文本,格式如下:即左边是随机字母,右边是随机数字, 即将相同的字母后面的数字加在一起,按字母的顺序输出

    以$1为下标,创建数组a[$1]=a[$1]+$2 或者(a[$1]+=$2)然后配合END和for循环输出结果:

    for(i in a ) :循环的顺序不是按照文本内容的顺序来处理的,排序可以在命令后用sort

    1.4 awk索引数组

    以数字为下标的数组seq生成1-10数字,,只显示奇数行

    seq生成1-10的数字,要求不显示文件的后3行

    改变i的范围

    1.5 awk数组实战去重

    a++ 和++a

    对一下文本进行去重处理 针对第二列去重

    解法一:

    解析:
    !a[$2]++是模式(条件),命令也可写成awk '!
    a[$2]=a[$2]+1{print $0}' 22.txt
    a[$2]++ ,“++”在后,先取值后加一
    !a[$2]=a[$2]+1:是先取a[$2]的值,比较“!a[$2]”是否符合条件(条件非0),后加1
    注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行

    解法二:

    解析:
    ++a[$2]==1是模式(条件),也可写成a[$2]=a[$2]+1==1即只有当条件(a[$2]+1的结果)为1的时候才打印出内容
    ++a[$2] ,“++”在前,先加一后取值
    ++a[$2]==1:是先加1,后取a[$2]的值,比较“++a[$2]”是否符合条件(值为1)
    注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行

    解法三:

    解析:
    注意此方法去重后的结果显示的是文本结尾开始的所有不重复的行

    1.6 awk处理多个文件(数组、NR、FNR)

    解析:NR==FNR处理的是第一个文件,NR!=FNR处理的是第二个文件.
    注意:当两个文件NR(行数)不同的时候,需要把行数多的放前边.
    解决方法:把行数多的文件放前边,行数少的文件放后边.

    把输出的结果放入一个新文件new.txt中:

    1.7 awk分析日志文件,统计访问网站的个数

    2、awk简单语法

    2.1 函数sub gsub

    sub只会替换行内匹配的第一次内容;相当于sed ‘s###’
    gsub 会替换行内匹配的所有内容;相当于sed ‘s###g’

    案例

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

    方法一:

    方法二:

    2.2 if else

    2.3 next用法

    解析:
    {print $0" NO YES"}:此动作是默认执行的,当前边的$0~/AA/匹配,就会执行{print $0" YES";next}
    因为action中有next,所以会跳过后边的action。
    如果符合$0~/AA/则打印YES ,遇到next后,后边的动作不执行;如果不符合$0~/AA/,会执行next后边的动作;
    next前边的(模式匹配),后边的就不执行,前边的不执行(模式不匹配),后边的就执行。

    2.4 printf不换行输出及next用法

    printf :打印后不换行

    如下文本,如果 Description:之后为空,将其后一行内容并入此行。

    解法一:

    解析:使用正则匹配,匹配到'/^Desc.*:$/,就使用printf打印(不换行),不匹配的打印出整行。

    解法二(使用ifelse实现):

    解法三(使用next实现):

    注:可简写成awk '/Desc.*:$/{printf $0;next}1'
    printf.txt ## 1是pattern(模式),默认action(动作)是{print $0}

    2.5 去重后计数按要求重定向到指定文件

    文本如下,要求计算出每项重复的个数,然后把重复次数大于2的放入gt2.txt文件中,把重复次数小于等于2的放入le2.txt文件中

    解析:{print },或括号中打印后可直接重定向到一个新文件,文件名用双引号引起来。如: {print $1 >"xin.txt"}

    3、awk总结

    • NR==FNR ##不能写成NR=FNR(=在awk中是赋值的意思)
    • NR!=FNR ##NR不等于FNR
    • {a=1;a[NR]} 这样会报错:同一条命令中变量和数组名不能重复 d)printf 输出的时候不换行
    • {print },或括号中打印后可直接重定向到一个新文件,文件名用双引号引起来。如: {print $1 >"xin.txt"}
    • 当模式(条件)是0的时候,后边的动作不执行,!0的时候后边动作才执行。

    原文地址:https://mp.weixin.qq.com/s/2Ic4lCBTYjxMuC8lH5IdVg

  • 相关阅读:
    SDN实验 7: OpenDaylight 实验——Python 中的 REST API 调用
    2020软工第四次作业:结对编程作业
    SDN实验 6: OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    SDN实验 5: OpenFlow 协议分析和 OpenDaylight 安装
    SDN实验 4: Open vSwitch 实验——Mininet 中使用 OVS 命令
    2020软工第二次作业
    SDN实验3:Mininet 实验——测量路径的损耗率
    软件工程实践个人总结
    软件工程实践番外篇——获小黄衫有感
    软件定义网络实验 7:OpenDaylight 实验——Python 中的 REST API 调用(含选做题)
  • 原文地址:https://www.cnblogs.com/hyunbar/p/13260732.html
Copyright © 2011-2022 走看看