linux || awk(1)

2019-03-25  本文已影响0人  溪溪溪溪溪川

awk学习

AWK其名得自于三位创始人 Alfred Aho,Peter Weinberger和 Brian Kernighan 的 Family Name 的首字符。
AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法
awk [options] 'Pattern{Action}' file
awk [options] -f scriptfile var=value file(s)

其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

选项参数说明:
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F,默认域分隔符:空格或Tab。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
运算符
运算符 描述
= += -= *= /= %= ^= **= 赋值
? C条件表达式
逻辑运算符
|| 逻辑或
&& 逻辑与
正则运算符号
~ ~! 匹配正则表达式和不匹配正则表达式
关系运算符号
< <= > >= != == 关系运算符
算数运算符
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
其他运算符
空格 字符串连接符
$ 字段引用
?: 三目运算符
in 数组成员 数组中是否存在某键值
内置变量
变量 描述
$n 当前记录的第n个字段,字段间由FS分隔,$n表示第n个域
$0 完整的输入记录,$0则表示所有域
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
示例
1.打印1-3行的两种表示
pengzw@super-server:~$ awk '{if(NR>=1 && NR<=3) print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
pengzw@super-server:~$ awk 'NR>=1 && NR<=3 {print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

2.过滤出 good up,利用-F可以指定多个分隔符,两列中间添加tab或blank需要双引号。 "[ ,]" 或者 [" ",]

pengzw@super-server:~$ cat test.txt 
Good good study, day day up!
pengzw@super-server:~$ awk -F "[ ,]" '{print$1 " "$7}' test.txt
Good up!

3.正则运算符号

pengzw@super-server:~$ awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
ok

4.其他

awk '$3 =="gene" {print $0 }' gff  将第三列为gene的行输出到屏幕上
awk '$1 =="Chr1"  && $4 >= 1 && $5 <=100  {print $0 }' gff  #输出指定区域的整行,改变$0,输出$4列数据
awk '$1 =="Chr1"  && $4 >= 1 && $5 <=100  {print $4 "\t"$5 }' gff  #输出起始和终止位置

上一篇下一篇

猜你喜欢

热点阅读