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 输出 ‘,“ 单引号,双引号