#每日Linux小练习#05 awk-好用的数据处理工具

awk是数据处理工具。相比如sed常作用于一整行的处理,awk则倾向于将一行分为数个“字段”来处理。

因此,awk适合处理小型的数据。

awk的基本模式如下:

awk '条件类型1{动作1}条件类型2{动作2}'

 

首先,看一段基本的代码

echo "basis exmaple pf awk"
echo "**************************"
echo "before awk###############"
last -n 5
echo "after awk################"
last -n 5 | awk '{print $1 "\t" $3}'

1、awk默认使用空格或者[tab]键来分隔,分别储存在$1、$2、$3。。。中,$0代表一整行

 

awk有一些内置变量

内置变量名称 代表意义
NF 每一行拥有的字段总数(多少列)
NR 目前awk处理的是“第几行”的数据
FS 目前的分隔符,默认是空格或者[Tab]
echo " "
echo " "
echo "change FS"
echo "**************************"
cat /etc/passwd | awk '{FS=":"}  $3< 10 {print $1 "\t" $2 "\t" $3}'
echo " "
echo "add BEGIN"
cat /etc/passwd | awk ' BEGIN {FS=":"}  $3< 10 {print $1 "\t" $2 "\t" $3}'
echo "add BEGIN"
cat /etc/passwd | awk ' BEGIN {FS=":"}  $3< 10 {print $1 "\t" $2 "\t" $3 "\tlines:" NR "\t columes" NF}'

 

1、执行第一个动作  {FS=":"} 将分隔符改为:

2、分隔符不会立即生效,需要到第二行才能生效,所以增加BEGIN关键词,这样第一行也能生效

 

echo " "
echo " "
echo "calculate"
echo "**************************"
echo -e "Name \t 1st \t 2nd \t 3th" > ./material/20150807awk_pay.txt
echo -e "Liu \t 26 \t 200 \t 300" >> ./material/20150807awk_pay.txt
echo -e "Wu \t\t 24 \t 210 \t 310" >> ./material/20150807awk_pay.txt
echo -e "Chen \t 24 \t 220 \t 320" >> ./material/20150807awk_pay.txt
echo -e "Zhong \t 25 \t 230 \t 330" >> ./material/20150807awk_pay.txt

cat ./material/20150807awk_pay.txt | \
awk 'NR==1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}  #第一个动作
NR>=2 {total= $2 + $3 + $4                           #第二个动作
printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'

1、echo -e "\t"可以将tab键打印出来,如果是 echo "\t",打印出来的是\t这两个字符

2、这个实例中,存在不同的判断条件,然后紧跟着对应的动作。如果需要多个命名辅助,可利用分号或者[Enter]来分隔命令

3、与bash,shell的变量不同,在awk中,变量可以直接使用(如最后一句的total),不需要加上$符号

 

posted on 2015-08-08 10:44  依风152  阅读(350)  评论(0编辑  收藏  举报