awk 初步学习笔记

来源:互联网 发布:java spring mvc 编辑:程序博客网 时间:2024/06/03 22:44

1 . awk 的应用场景
需要重新安排数据的格式时

2 . awk 的格式
awk 'BEGIN {startup code} conditions1{actions1} conditions2{actions2} ... END {cleanup code}'
#其中BEGIN 与 END 语句组是可选的
#conditions[:alnum:] 如果满足则执行相应的actions[:alnum:]
#conditions[:alnum:] 如果不存在 ,则直接执行 actions[:alnum:]

3 . awk 的变量
$0 存储awk当前处理的行
$1 存储awk当前处理的行的第一个字段
$2 存储awk当前处理的行的第二个字段
....
$n 存储awk当前处理的行的第n 个字段

FS  awk处理输入的行时使用的字段分隔符( Field Seperator )
OFS awk输出的字段的分隔符( Output Field Seperator )
NF  awk当前处理的行中有多少个字段( Number of Fields )
NR  awk当前正在处理第几行数据(Number of current row )

4 . awk使用的print的特点
--print 后面跟着多个字段 ,每个字段由逗号隔开 ,输出时 ,每个字段之间自动加OFS变量的值;
(如果不使用逗号隔开每个字段那么可能导致输出格式混乱 。)
--print 还有一个特点,就是输出行的末尾会自动输出换行符.

owner@YZY:~$ echo 07302284 yao 19890318 shantou guangdong | awk '{print NR , $1 , $2 , $3 }'
1 07302284 yao 19890318

owner@YZY:~$ echo 07302284 yao 19890318 shantou guangdong | awk '{print NR  $1  $2  $3 }'
107302284yao19890318

owner@YZY:~$ echo 07302284 yao 19890318 shantou guangdong | awk '{print NR "/t" $1 "/t" $2 "/t" $3 }'
1    07302284    yao    19890318


5 . awk使用的printf的特点
-- 必须显式地换行

6 . awk的FS变量的用法
--在BEGIN语句中设置即可
--使用-F选项
owner@YZY:~$ grep owner /etc/passwd | awk 'BEGIN {FS=":"}{print $1,$3,$4}'
owner 1000 1000


wner@YZY:~$ grep owner /etc/passwd | awk -F: '{print $1,$3,$4}'
owner 1000 1000

7 . awk的OFS变量的用法
--由于print会自动使用OFS ,并且OFS默认是一个空格 ,所以如果对格式有特别的要求 ,可以在BEGIN语句中对OFS进行设置.
--使用-v 选项后面跟一个用单引号括起来的对OFS的赋值语句

owner@YZY:~$ echo 07302284 yao 19890318 | awk 'BEGIN {OFS="---new OFS---"} {print $1 , $2 , $3}'
07302284---new OFS---yao---new OFS---19890318


wner@YZY:~$ echo 07302284 yao 19890318 | awk -v 'OFS=---new OFS---' '{print $1 , $2 , $3}'
07302284---new OFS---yao---new OFS---19890318

8 . awk中使用变量
--直接使用,不需要使用$作为前缀
#文件marks
name  chinese english math
yao   100     100     100
yu    90      90      90
zeng  80      80      80


owner@YZY:~$ cat marks | awk '
>NR==1{printf "/t%s/t%s/t%s/t%s/t%s/n" , $1 , $2 , $3 , $4 , "sum"}
>NR>=2{total=$2+$3+$4 ; printf "/t%s/t%d/t%d/t%d/t%d/n" , $1 , $2 , $3 , $4 , total}'
    name    chinese    english    math    sum
    yao    100    100    100    300
    yu    90    90    90    270
    zeng    80    80    80    240

原创粉丝点击