使用awk格式化输出文本(3)

awk '/AL/ {printf $1; print $2}' emp.txt awk '/AL/{print $1} {print $2}' emp.txt

1.第一种只处理匹配到AL的行; 然后打印这些行的第一字段和第二字段

2.第二种只有在匹配到AL的行才打印字段一,但是字段二是无条件的,始终打印

 2.awk内置函数用法

如下文本test.log,需要把文本中单位是"M"的字段转换为"G"

16G 16G 1.9G 40G none 4G 4G 952M 60G 16G 16G 1.6G 40G none 5G 780M 5G 80G

若我们单纯地想替换字符串,则可以使用一下命令,注意:print没带默认参数时,默认打印整行记录

cat 1.txt | awk '{
  sub(/M/,"G",$i)
  print
}
'

完整替换如下,替换的同时进行数值计算

cat 1.log | \ awk '{ for(i=1;i<=NF;i++){ if($i ~ /M/) printf int(substr($i,1,match($i,/M/)-1)/1024*100)/100"G\t" else printf $i"\t"   } print "" }'

1.使用for遍历每一行的每一个字段,使用if处理匹配到"M"的字段,然后调用awk内置函数int, substr, match处理, 关于awk内置函数,可以参考Linux awk 内置函数详细介绍(实例) 

2.先乘100,再除以100,是为了转换为"G"单位后保留两位小数

3.注意 printf,print 两个函数的区别

3.awk条件语句

如第二个例子中的文本,现在需要分别统计每行中带有"G", "M", "none" 字段的个数,并输出

cat test.log | \ awk ' BEGIN{OFS="\t"} { a=b=c=0 for(i=1;i<=NF;i++){ if($i ~ /G/) a+=1 else if($i ~ /M/) b+=1 else c+=1 } print $0,"G:"a,"M:"b,"none:"c } END{print "end!"} '

结果如下:

16G 16G 1.9G 40G G:4 M:0 none:0 4G 4G 952M 60G G:3 M:1 none:0 16G 16G 1.6G 40G G:4 M:0 none:0 5G 780M 5G 80G G:3 M:1 none:0 end!

4.awk中break用法

给出一个如下文本test2.log,在每一行中,只输出字母及其之前的字符

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15334.html