文本处理工具awk-命令详解

文本处理工具awk
sed其实是以行为单位的文本处理工具,而awk则是基于列的文本处理工具。它的工作方式是按行读取文本
并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。
awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,这里的‘空白字符’包括空格、tab,
以及连续的空格和Tab等。每个非空白的部分叫做‘域’,从左到右依次是第一个域、第二个域,等等。$1、$2
分别用于表示域,$0则表示全部域。

演示文件:
vi awk.txt
john.wang Male 30 021-11111111
lucy.yang Female 25 021-22222222
jack.chen Male 35 021-33333333
lily.gong Female 20 021-44444444 ShangHai

1.打印指定域
既然awk使用$1、$2代表不同的域,则可以打印指定域。拿awk.txt第一行来说,第一个域为john.wang,第二
个域为Male,第三个域为30,第四个域为021-11111111。在下面演示中,第一条命令打印$1和$4这两个域,而第
二条命令则打印了全部的域
#只打印姓名和电话号码
awk '{print $1,$4}' awk.txt
#打印全部内容
awk '{print $0}' awk.txt

2.指定打印分隔符
默认情况下awk是使用空白符作为分隔符的,但是也可以通过-F参数指定分隔符,来区分不同的域(有点像cut命令)。
示例如下:
#指定“.”作为分隔符,这样每一行的$1就是.之前的字符,$2就是.之后的字符
awk -F . '{print $1,$2}' awk.txt

3.内部变量NF
文件awk.txt所包含的内容并不多,所以我们很容易的知道它的前3行中每行都有4个域,而最后一行是5个域。但是
如果有时候文件很大,每行列数都不一样,靠观察就不现实了,必须通过特定的方式来获得文件的列数。通过awk
的内部变量NF可以简单的做到这点。当然,如果你指定了不同的分隔符,结果可能不一样。示例如下:
#使用默认分隔符
awk '{print NF}' awk.txt
#使用指定分隔符
awk -F . '{print NF}' awk.txt

4.打印固定域
通过内部变量可以简单的得到每行的列数,而如果在NF之前加上$符号,则代表‘最后一列’,这样不过每行有多少列,
只要使用$NF就能打印出最后一个域。
#打印最后一行
awk '{print $NF}' awk.txt
#用$(NF-1)打印倒数第二行
awk '{print $(NF-1)}' awk.txt

5.截取字符串
可以使用substr()函数对指定域截取字符串,该函数的基本用法如下:
substr(指定域,第一个开始字符的位置,结束的位置)
#其中第二个结束的位置可以为空,这样默认输出到该域的最后一个字符
#输出awk.txt文件第一个域的第六个字符到最后一个字符,第二个结束位置省略,所以结束位置为第一个域的最后一个字符
cat awk.txt |awk '{print substr($1,6)}'

6.确定字符串的长度
使用内部变量length可以确定字符串的长度,示例如下:
#打印第一个域的长度
awk '{print length($1)}' awk.txt
#打印每行所有域的长度,包括空白符
awk '{print length}' awk.txt

7.在日常工作中,经常有将其中的数据进行相加的需求。下面演示了对所有人的年龄进行的一些计算。请注意,年龄字段是
第三个域:
#求年龄的和
cat awk.txt | awk 'BEGIN{total=0}{total+=$3}END{print total}'
#求平均年龄(NR是行数,包含空行,如需去除需加sed '/^$/d')
cat awk.txt | awk 'BEGIN{total=0}{total+=$3}END{print total/NR}'

posted on 2019-05-24 17:08  寻书郎-QQ318700058  阅读(243)  评论(0编辑  收藏  举报

导航