版权声明:版权所有,翻版必究【Kevin】 https://blog.csdn.net/weixin_30935137/article/details/84494633
awk脚本基本结构
awk 'BEGIN{print "start"} pattern {commands} END{print "ends"}' file
#执行过程
awk 'BEGIN {commands} pattern{commands}END{commands}' filename
[1]第一步:执行BEGIN{commands} 语句块中的语句;
[2]第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{commands}语句块,它逐行扫描文件,第一行到最后一行重复这个过程,直到文件全部被读取完毕;
[3]第三步:当读至输入流末尾时候,执行END{commands}语句块
常用格式
awk [-F field-separator] 'commands' inputfile
其他参数
$0:表示整个当前行
NF:每行行的字段数
NR:每行的记录号
OFS:输出字段分隔符
按指定分隔符分割并提取所有字段
[wujiadong@localhost test]$ awk -F"\t" '{print $0}' test.txt
wu M 23 JX 20181111
LIU F 22 XA 20151213
JIANG M 33 AH 20161121
提取指定字段列
#中间加逗号,字段使用空格分割
[wujiadong@localhost test]$ awk -F"\t" '{print $1,$2}' test.txt
wu M
LIU F
JIANG M
#中间没有逗号,字段相连输出不分割
[wujiadong@localhost test]$ awk -F"\t" '{print $1 $2}' test.txt
wuM
LIUF
JIANGM
加入表头并提取指定字段
[wujiadong@localhost test]$ awk -F"\t" 'BEGIN {print "name gender"} {print $1,$2}' test.txt
name gender
wu M
LIU F
JIANG M
根据条件筛选行
#输出第一行
iadong@localhost test]$ awk -F'\t' 'NR==1{print $0}' test.txt
wu M 23 JX 20181111
#输出第一行和第三行
[wujiadong@localhost test]$ awk -F'\t' 'NR==1||NR==3{print $0}' test.txt
wu M 23 JX 20181111
JIANG M 33 AH 20161121
#带行号输出
[wujiadong@localhost test]$ awk -F'\t' 'NR==1||NR==3{print NR, $0}' test.txt
1 wu M 23 JX 20181111
3 JIANG M 33 AH 20161121
#输出字段数
[wujiadong@localhost test]$ awk -F'\t' 'NR==1||NR==3{print NR,NF,$0}' test.txt
1 5 wu M 23 JX 20181111
3 5 JIANG M 33 AH 20161121
#不输出第一行
[wujiadong@localhost test]$ awk -F'\t' 'NR!=1{print $0}' test.txt
LIU F 22 XA 20151213
JIANG M 33 AH 20161121
#输出偶数行
[wujiadong@localhost test]$ awk -F'\t' '{if(NR%2==0)print $0}' test.txt
LIU F 22 XA 20151213
#输出奇数行
[wujiadong@localhost test]$ awk -F'\t' '{if(NR%2==1)print $0}' test.txt
wu M 23 JX 20181111
JIANG M 33 AH 20161121
#保留第一行并输出偶数行
[wujiadong@localhost test]$ awk -F'\t' 'NR==1||NR%2==0{print $0}' test.txt
wu M 23 JX 20181111
LIU F 22 XA 20151213
#输出时指定分隔符
[wujiadong@localhost test]$ awk -F'\t' 'BEGIN{OFS=";"} NR==1||NR%2==0 {print $1,$2}' test.txt
wu;M
LIU;F