awk ‘BEGIN{动作};模式{动作};模式{动作}。。。;END{动作}’ file
pattern缺省为1,action缺省为print
那么 awk ‘1’完整的写法就是 awk ‘1{print}’; 同理, awk ‘{print}’完整的写法也是 awk ‘1{print}’。
1.
取出password中shell出现的次数
awk -F : '{a[$7]++}END{for(i in a){print i,a[i]}}' /etc/passwd
2.文件整理
employee文件中记录了工号和姓名
employee.txt:
100 Jason Smith
200 John Doe
300 Sanjay Gupta
400 Ashok Sharma
bonus文件中记录工号和工资
bonus.txt:
100 $5,000
200 $500
300 $3,000
400 $1,250
要求把两个文件合并并输出如下
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $1,$2,a[$1]}' bonus.txt employee.txt
100 Jason $5,000
200 John $500
300 Sanjay $3,000
400 Ashok $1,250
How works:
FNR file
line number 包含了一个文件的当前的行号,多个文件会重新编号
NR:文件总行号,区别是多个文件编号时不会重新编号
awk '
NR==FNR ....
NR>FNR ...' bonus.txt employee.txt :
读入bonus.txt时,已读入bonus.txt的记录数FNR一定等于awk已经读入的总记录数NR,因为bonus.txt是awk读入的首个文件,故执行前一个命令块{a[$1]=$2}, a[100]=$5000,
读入employe.txt时,NR一定大于FNR,处理{print $1,$2,a[$1]}
现有文本文件日志:
游戏id 在线时常time QQ号码
6534 456 37354893
6500 056 564572105
6534 4156 37354893
6500 2456 564572100
……… ………
要求,写shell脚本对改文件按照第二列在线时常排序,然后,统计每个QQ号总共时长和。
cat test.txt | sort -k1 | awk '{qq[$3]+=$2}END{for(i in qq) print "qq:"i, qq[i]}'
[root@localhost ~]# cat test
zhangsan 80
lisi 81.5
wangwu 93
zhangsan 85
lisi 88
wangwu 97
zhangsan 90
lisi 92
wangwu 88
[root@localhost ~]#
要求输出格式:(average:平均成绩,total:总成绩)
name#######average#######total
zhangsan xxx xxx
lisi xxx xxx
wangwu xxx xxx
awk '{name[$1]++;total[$1]+=$2}END{for(i in total){print total[i],name[i],i};}' test.txt
name["zhangsan"]=0, for i in name: print i就是现在方括号里面的值:zhangsan , name[i]=name["zhangsan"]=0
total["zhangsan"]+=12
阅读(1119) | 评论(0) | 转发(0) |