美文网首页
2023-01-30 awk入门及进阶

2023-01-30 awk入门及进阶

作者: 梧唯 | 来源:发表于2023-01-31 02:02 被阅读0次

    回顾:

    grep:文本过滤器  

            grep 'pattern' input_file ...

    sed:流编辑器

           sed 'COMMAN/PATTERN/'

    awk: 报告生成器,格式化以后,显示

     a.k.a. Aho, kernighan and Weinberger

    在linux中是gawk

    # awk [options] 'script' file1 file2, ...

    # awk [options] 'PATTERN {action}' file1 file2, ...(action中有多个语句要用;隔开)

        print, printf

    $0表示一整行

    如果N是一行的最后一个字段,$N引用的时候自带了末尾的换行符(实践得出的)

    -F 指定分隔符

    OFS=”pattern" 指定输出分隔符

    一、print

    print的使用格式:print item1,item2,...可随处插入“文本”

    \n:换行符,行分隔符是换行符

    二、awk变量

    2.1 awk内置变量之记录变量:

    FS:field separator,读取文本时,所使用的字段分隔符,默认是空白字符

    RS: Row separator,输入文本信息所使用的换行符,默认是换行符;

    OFS:Output field Separator

    ORS:Output Row Seperator

    2.2 awk内置变量之数据变量:

    NR:The number of input records, awk命令处理过的行数,如果有多个文件,这个数目会把处理的多个文件中行统一计数;

    NF:Number of field,当前记录的field个数

    FNR:与NR不同,FNR用于记录正处理的行是当前这一文件中被总共处理的行数

    2.3 用户自定义变量

    gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母,数字和下划线,且不能以数字开头。gwak变量名称区分字符大小写。

    awk中第一次引用一个变量,且没有赋值的话, 默认值为0

    2.3.1 在脚本中赋值变量

    在gwak中给变量赋值使用赋值语句进行,例如:

    awk 'BEGIN{var(变量名)="variable testing(赋予变量的值)";print var}'

    2.3.2 在命令行中使用赋值变量

    gwak命令也可以在“脚本”(即打括号内)外为变量赋值,并在脚本中进行引用。

    awk -v var="variable testing" 'BEGIN{print var}'

    在awk中,打印变量值是不需要加$的,加$的表示第几个字段

    awk不带文件的话只需要用BEGIN

    三、printf

    printf命令的使用格式:

    printf format,item1,item2,...

    1.需要指定format

    2.format用于指定后面的每个item的输出格式

    3.printf语句不会自动打印换行符:\n 想换行的话要带上

    format格式的指示符都以%开头,后跟一个字符:如下:

    %c:显示字符的ASCⅡ码;

    %d,%i:十进制整数

    %e,%E:科学计数法显示数值;

    %f:显示浮点数;

    %g,%G:以科学计数法的格式或浮点数的格式显示数值;

    %s:显示字符串;

    %u:无符号整数;

    %%:显示%自身;

    修饰符:N:显示宽度;(如%10s,显示10个字符串)

                  -:左对齐(不使用的时候默认右对齐)(%10s是“         s”,%-10s是“s          ”)

                  +:显示数值符号;

    四,awk操作符

    4.1算术操作符:

    -x:负值

    +x:转换为数值

    x^y

    x**y:次方

    x*y:乘法

    x/y:除法

    x+y:

    x-y:

    x%y;

    4.2赋值操作符

    =   +=(将加的结果赋给变量)    -=(将减的结果赋给变量)    *=(将乘的结果赋给变量)   /=(将除的结果赋给变量)   %=(将取模的结果赋给变量)   ^=(将取幂的结果赋给变量)   **=(将取幂的结果赋给变量)

    ++(递增操作符)    --(递减操作符)   

    递增和递减操作符可以出现在操作数的任何一边,位置不同可以得到不同的计算结果。

    ++x 在返回结果前递增x的值(前缀)

    x++ 在返回结果后递增x的值(后缀)

    4.3布尔值

    awk中,任何非0值或非空字符串都为真,反之就为假;

    4.4比较操作符

    <小于

    <=小于等于

    >大于

    >=大于等于

    ==等于(一个=是赋值)

    !=不等于

    x ~ y (x是字符串,y是正则表达式模式,如果x能被y指定的模式匹配到则为真,否则则为假)

    x !~ y 与上相反

    subscript in array 在array数组中有对应的元素则为真,否则为假

    4.5表达式间的逻辑关系符:

    && 逻辑与

    ||    逻辑或

    4.6 条件表达式

    selector?if-true-exp;if-false-exp(简化版的两分支if语句)

    意思是 if selector;then

                   if-true-exp

               else

                    if-false-exp

               fi

    五,awk的模式

    5.1 常见的PATTERN类型

    1.regexp:正则表达式,格式为/regular expression/

    2.expression:表达式,其值为0或为非空字符时满足条件,用运算符~(匹配)和~!(不匹配)

    $锚定行尾

    3.Ranges:指定的匹配范围,格式为pat1,pat2

    4.BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

    # awk 'BEGIN{action}{action}END{action}' file

    5.empty(空模式):匹配任意输入行

    5.2 常见的Action

    1.Expressions;

    2.Control statements

    3.Compound statements

    4.Input/Output statments

    六,控制语句

    6.1 if-else

    语法:if (condition) {then-body} else {[else-body]}

    6.2 while(循环字段)

    语法:while(condition){statement1;statement2;...}

    6.3 do-while

    语法:do{statement1,statement2,...}while(condition)

    6.4 for

    语法:for (variable assignment; condition; interation process) {statement1,statement2,...}

    6.5 case

    语法:switch(expression) {case VALUE or /REGEXP/: statement1, statement2, ...default: statement1, ...}

    6.6 break和continue(提前处理下一个字段)

    常用于循环或case语句中

    6.7 next

    提前结束对本行文本的处理,并接着处理下一行

    七,awk中使用数组

    数组名[数组下标] (初始值是0)

    下标可以是数字,也可以是字符串

    输出数组内的数据用for循环,for(A(任意起一个变量名)in array){print A, array[A]} 输出数组内所有下标及对应的值

    八.awk的内置函数

    length([string]):返回string字符串中字符的个数\

    例子 :

    1.awk '(NR%2)==1{print}'  #输出奇数行

    需要把几行合并,经常用到方法是:NR%num 然后将行值保存下来,next该行。在输出时候打印出来。

    next:表示直接读取下一行而不执行其余语句

    2.按a.txt文件的第二列匹配b.txt文件的第一列并输出所有b.txt文件中匹配的行

    # awk 'NR==FNR{arr[$2];next}$1 in arr' a.txt b.txt

    解释:当NR==FNR时(注意是双等号,单等号意味着赋值),即处理总行等于当前文本处理行数时,即处理第一个文本a.txt时,将$2以下标的形式存储在arr数组中,然后next读取下一行,不执行其他语句;

    当NR不等于FNR时(在本例中即NR>FNR时),即处理第二个文本时,检索如果$1处在在arr数组中(下标也可以检索),则默认输出整行(省略了{print $0}).

    从而实现以a.txt为依据筛选b.txt中匹配的数据。

    3.选择几个文件中第一列重复的行并输出。

    cat A B C|cut -f1|sort -n|uniq -c|grep " n"

    相关文章

      网友评论

          本文标题:2023-01-30 awk入门及进阶

          本文链接:https://www.haomeiwen.com/subject/lehmhdtx.html