AWK使用总结

AWK使用总结

简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk使用总结,包括awk的格式化输出,awk的FS、OFS、RS、ORS,awk的NR、FNR、NF,引号的输出,循环输出和脚本中参数传递等使用重要的功能。

awk工作流


测试文件:cat employee.txt

101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

awk命令语法


awk -Fs '/pattern/ {action}' input-file
(或者)
awk -Fs '{action}' intput-file

输出print/printf


awk -F "," 'BEGIN{OFS="\t"}{print $1,$2,$3}' employee.txt

101     John Doe        CEO
102     Jason Smith     IT Manager
103     Raj Reddy       Sysadmin
104     Anand Ram       Developer
105     Jane Miller     Sales Manager

awk -F "," '{printf "%s \t %s \t %s\n",$1,$2,$3}' employee.txt

101      John Doe        CEO
102      Jason Smith     IT Manager
103      Raj Reddy       Sysadmin
104      Anand Ram       Developer
105      Jane Miller     Sales Manager

awk的FS、OFS、RS、ORS


awk 'BEGIN{FS=",";OFS="\t"}$1=$1{print}' employee.txt

101     John Doe        CEO
102     Jason Smith     IT Manager
103     Raj Reddy       Sysadmin
104     Anand Ram       Developer
105     Jane Miller     Sales Manager

awk 'BEGIN{RS=",";ORS=">>>>"}$1=$1{print}' employee.txt

101>>>>John Doe>>>>CEO 102>>>>Jason Smith>>>>IT Manager 103>>>>Raj Reddy>>>>Sysadmin 104>>>>Anand Ram>>>>Developer 105>>>>Jane Miller>>>>Sales Manager>>>>

awk的NR、FNR、NF


awk '{print NR,$0}' employee.txt employee.txt

1 101,John Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,Anand Ram,Developer
5 105,Jane Miller,Sales Manager
6 101,John Doe,CEO
7 102,Jason Smith,IT Manager
8 103,Raj Reddy,Sysadmin
9 104,Anand Ram,Developer
10 105,Jane Miller,Sales Manager

awk '{print FNR,$0}' employee.txt employee.txt

1 101,John Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,Anand Ram,Developer
5 105,Jane Miller,Sales Manager
1 101,John Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,Anand Ram,Developer
5 105,Jane Miller,Sales Manager

awk -F "," '{print NF,$NF}' employee.txt

3 CEO
3 IT Manager
3 Sysadmin
3 Developer
3 Sales Manager

引号的输出


awk -F "," '{print "\"" $1 "\"" "\t" "\"" $2 "\"" "\t" "'\''" $3 "'\''"}' employee.txt

"101"   "John Doe"      'CEO'
"102"   "Jason Smith"   'IT Manager'
"103"   "Raj Reddy"     'Sysadmin'
"104"   "Anand Ram"     'Developer'
"105"   "Jane Miller"   'Sales Manager'

循环输出


测试文件:cat fruit

apple       5
pear        6
banana      12
orange      3

awk '{for (i=0;i<$2;i++) printf "%s[%d]\n",$1,i}' fruit

apple[0]
apple[1]
apple[2]
apple[3]
apple[4]
pear[0]
pear[1]
pear[2]
pear[3]
pear[4]
pear[5]
banana[0]
banana[1]
banana[2]
banana[3]
banana[4]
banana[5]
banana[6]
banana[7]
banana[8]
banana[9]
banana[10]
banana[11]
orange[0]
orange[1]
orange[2]

脚本中参数传递


#!/bin/csh 
#得到$name变量
set name_lef = `find . -name "*.test"`
set name = `echo $name_lef | sed "s/\.\///g" | sed "s/\_tt//g" | sed "s/\.test//g"`

#方法 1:将$name传递给awk输出
echo $name
awk 'BEGIN{print "'$name'"}'

#方法 2
set test='awk code'
echo | awk -v test="$test" 'BEGIN{print test}'

参考资料


[1]. Sed-and-Awk-101-Hacks.pdf
[2]. awk内建变量示例详解之NR、FNR、NF
[3]. AWK 输出 ‘,“ 单引号,双引号

posted @ 2017-02-09 13:10  乔_木  阅读(256)  评论(0编辑  收藏  举报