回顾:
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"
网友评论