awk:强大的文本分析工具

QuibblerQuibbler 2020-03-28 约 14 分钟 1864 次阅读

awk:强大的文本分析工具

熟悉Linux的就不都不知道awk命令,校招的时候还被问道过awk命令的一些用法。awk取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。更多命令参考《Linux 命令大全》

awk '{[pattern] action}' {filenames}

1、简单用例

长时间不用很容易忘,看看简单的一些用法。演示数据test.txt,内容如下:

Beth    4.00    0
	Dan     3.75    0
	kathy   4.00    10
	Mark    5.00    20
	Mary    5.50    22
	Susie   4.25    18

1.1、输出某一列

查看某一列数据,打印{pinrt $n}

//输出第二列数据
    awk '{print $2}' test.txt
    
    //输出如下
    4.00
    3.75
    4.00
    5.00
    5.50
    4.25

1.2、输出符合条件的列数据

这时就用到了action

//输出第三列大于10的,却打印出对应的第二列数据
    awk '$3 > 10 {print $2}' test.txt
    
    //输出如下
    5.00
    5.50
    4.25

1.3、打印第一列和最后一列数据

第一列数据好或得,$0即可。最后一列呢?如果不知道有多少列怎么获取$n。还好awk有内建变量NF,可以使用,详细参考第三节。

//需要 , 分开
    awk '{print $1 ,  $NF}' test.txt
    
    //输出如下
    Beth 0
    Dan 0
    kathy 10
    Mark 20
    Mary 22
    Susie 18

1.4、一行有多少列

awk有内建变量NF

//使用NF内建变量
    awk '{print NF}' test.txt
    
    //输出如下
    3
    3
    3
    3
    3
    3

1.5、行号

内建变量, 叫做 NR

//输出第三列大于10的,带上行号
    awk '$3 > 10 {print NR , $NF}' test.txt
    
    //输出如下
    4 20
    5 22
    6 18

1.6、计算

对列与列之间的数据进行计算

//第二、三列数据相乘
    awk '{print $2 * $3}' test.txt
    
    //输出如下
    0
    0
    40
    100
    121
    76.5

2、awk全部选项

POSIX选项                        GNU长选项:(标准)

-f progfile                        --file=progfile

-F fs                                 --field-separator=fs

-v var=val                        --assign=var=val

Short选项                         GNU长选项:(扩展名)

-b                                     --characters-as-bytes

-c                                     --traditional

-C                                    --copyright

-d[file]                             --dump-variables[=file]

-D[file]                             --debug[=file]

-e 'program-text'            --source='program-text'

-E file                               --exec=file

-g                                     --gen-pot

-h                                     --help

-i includefile                    --include=includefile

-l library                           --load=library

-L[fatal|invalid]                --lint[=fatal|invalid]

-M                                   --bignum

-N                                    --use-lc-numeric

-n                                     --non-decimal-data

-o[file]                              --pretty-print[=file]

-O                                    --optimize

-p[file]                             --profile[=file]

-P                                     --posix

-r                                      --re-interval

-s                                     --no-optimize

-S                                     --sandbox

-t                                      --lint-old

-V                                     --version

3、awk内置变量

awk内置变量,引用菜鸟教程《Linux awk 命令》

$n当前记录的第n个字段,字段间由FS分隔
$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)

参考资料:

        AWK入门指南

        Linux awk命令详解

相关推荐

精选
获取系统SDK版本、判断手机ROM
Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

3.7k
精选
AndroidStudio中各种中文乱码问题
Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.4k
AndroidStudio 报错:has no declaration in the base values folder
Code

AndroidStudio 报错:has no declaration in the base values folder

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

4.4k