越来越发现awk的强大,做了实验,做了总结 备忘!!
/**在linux shell中调用awk (awk 'xxxxxxx' xxxxxxx即为awk命令,命令必须包含在单引号中,至少双引号都不行)**/
/**awk 显示文本文件myfile中中以字符%分隔的第一字段,第三字段和第七字段及NF(域的个数):**/
方法一:awk -F '%' 'NR==7,NR==15 {print $1 $3 $7 NF}'
方法二:awk '{FS="%"} NR==7,NR==15 {print $1 $3 $7 NF}'
{FS="%"}:设置awk分隔符
NF:显示域的个数(不是分隔符数,一般应该是分隔符数加1)
# cat test1.txt
aa bb c
# cat test1.txt | awk '{print NF}'
3
NR==7,NR==15:第七行到第十五行 (貌似只能设两个,设置三个会报错 如:NR==7,NR==15,NR==20)
注意:NR==7,NR==15 {print $1 $3 $7 NF} 要写在一行里,中间不能有分号
print:打印时会换行,printf:打印时不会换行 (还没弄明白为什么)
/**awk显示第5列有A,L或LIKE的所有列 **/
awk '$5~ /[A,L,LIKE]/ {print $0}' tmp.txt
/**awk显示第5列不包含A或L的所有列 **/
awk '$5!~'/[A,L]/' {print $0}' tmp.txt
/**打印行号,OFS在$1,$2之间以"-"分隔**/
awk 'OFS="-" {print NR,$1,$2 }' tmp.txt
NR:行号
OFS:将需要输出数据的分隔符
# cat test1.txt
aa bb c
# cat test1.txt |awk ' OFS="-" {print $0}'
aa bb c
--因为没有分隔符,也没分域,相当于只有一个域,所以没打出"-"
#cat test1.txt |awk ' OFS="-" {print $1 $2 $3}'
aabbc
--不带分隔符打出各域
# cat test1.txt |awk ' OFS="-" {print $1, $2, $3}'
aa-bb-c
--有了逗号,所以中间要有分隔符
/**利用BEGIN和END打印页眉页脚(支持转义)**/
# awk 'BEGIN {print "begin\nbegin2"}{print $0}{print $0}END{print "end"}' test1.txt
begin
begin2
aa bb c
aa bb c
end
/**把test1.txt前面加上行号,追加到tt22中**/
#awk '{print NR,$0 >> "./tt22"}' test1.txt
#cat tt22
1 aa bb c
/**管道输出并执行shell命令**/
awk '{print $0 | "sort"}' tmp.txt
# cat test2.txt
1
3
2
# awk '{print $0 | "sort"}' test2.txt
1
2
3
/**从文件读取awk命令并执行: awk -f awk脚本名 目标文件 **/
# cat test.awk
BEGIN {FS="\t";OFS="-"}
{print $1,$2}
# cat test2.txt
1
3
2
# awk -f test.awk test2.txt
1-
3-
2-
/**把第一竖排变成横排**/
#awk '{printf("%s,",$1)}' test2.txt
1,3,2,