美文网首页
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