awk 常用示例(待续).....

本文介绍了awk命令的多个实用示例,包括分组统计次数、求和、平均值和最值。内容涉及多元分组统计、过滤空行、去重、求和/平均/最值计算等操作,以及行转列和字段长度计算。通过这些示例,读者可以深入理解awk在数据处理和分析中的强大功能。
摘要由CSDN通过智能技术生成

awk 常用示例(待续)…

示例

#示例1
cat file
unix  3      [ ]         STREAM     CONNECTED     2709a    /run/systemd/journal/stdout
unix  2      [ ]         DGRAM      CONNECTED     9972x88    
unix  3      [ ]         STREAM     CONNECTED     2268     /run/dbus/system_bus_socket
unix  2      [ ]         STREAM     CONNECTED     -2270    /run/systemd/journal/stdout
unix  2      [ ]         DGRAM                    a19686   /run/dbus/system_bus_socket    
unix         [ ]         STREAM     CONNECTED     2269     /run/dbus/system_bus_socket
unix  2      [ ]         DGRAM      CONNECTED     -717    
      3      [ ]         STREAM     CONNECTED     -a20198  /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     b-19629  /run/dbus/system_bus_socket
unix  2      [ ]         DGRAM      CONNECTED     -16081a  /run/dbus/system_bus_socket

- 分组统计(次数/求和/平均/最值)

#分组统计(次数/求和)
awk '{a[$1]++}END{for(i in a)print i,a[i]}' file
	 1
	unix 9
	3 1
awk '/^unix/{a[$1]++}END{for(i in a)print i,a[i]}' file
	unix 9
awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}'  file
	 0
	unix 19
	3 0

## - 多元分组统计(次数/求和)

awk '/^unix/&&$2~/[0-9]/{a[$1,$5]++}END{for(i in a)print i,a[i]}' file
	unix STREAM 4
	unix DGRAM 4
awk '/^unix/&&$2~/[0-9]/{a[$1,$5]+=$2}END{for(i in a)print i,a[i]}' file
	unix STREAM 11
	unix DGRAM 8

## - 多元分组统计(求最值)
#求最大
awk '/^unix/&&$7!~/[a-zA-Z]/{print }' file |awk '{x=$7;if(a[$1,$5]+0<x+0){a[$1,$5]=x}}END{for(i in a)print i,a[i]}' 
unix STREAM 2268
unix DGRAM 
#说明:由于非数字开头字符及空值按0计算,所以首次出现负值时会出现空值

#修复(过滤空行)
awk '/^unix/&&$7!~/[a-zA-Z]/{print }' file |awk '{x=$7;if(a[$1,$5]+0<x+0){a[$1,$5]=x};if(a[$1,$5]==""){a[$1,$5]=$7}}END{for(i in a)print i,a[i]}' 
unix STREAM 2268
unix DGRAM -717

#求最小
awk '/^unix/&&$7!~/[a-zA-Z]/{print }' file |awk '{x=$7;if(a[$1,$5]+0>x+0){a[$1,$5]=x};if(a[$1,$5]==""){a[$1,$5]=$7}}END{for(i in a)print i,a[i]}' 
unix STREAM -2270
unix DGRAM -717

去重

 #方式一:
 awk '!a[$0]++{print}' file
    #输出省略
    
 awk '!a[$1]++{print $1}' file
	unix
	
	3
 #方式二(固定列)
 awk '{a[$1]++}END{for(i in a) print i}' file

	unix
	3
 #过滤空行
 awk '!/^$/{a[$1]++}END{for(i in a) print i}' file
	unix
	3

求和/平均/最值

#示例2
cat file2
	a x 2
	a x 
	
	b x 0.01
	b y 123abc4566
	c x a34
	d x aa
	b x 3
	a y 4
	a x 3
	b y 4
	c x 1
	a y 9
	b x 8
	c y 2
#求和/平均
awk '{sum+=$3}END{print sum}'  file2
	159.01
awk '{sum+=$3}END{print sum/NR}'  file2
	10.6007
#取两位小数
awk '{sum+=$3}END{printf("%.2f\n",sum/NR)}'  file2
	10.60
#过滤空行及包含字符的行后
awk '!/^$/&&$3!~/[a-zA-Z]/{num++;sum+=$3}END{print num, sum/num}'  file2
	11 3.27364

#求最大值
 awk 'BEGIN{x=0}{if($3+0>x+0){x=$3}}END{print x}' file2
	123abc4566
#过滤字符后处理
 awk 'BEGIN{x=0}$3!~/[a-zA-Z]/{if($3+0>x+0){x=$3}}END{print x}' file2
	9
#说明:当列值中含有数字+字符时,取字符前数字部分,**如123abc4566作为数字123处理**,其他情况含字符作为0处理***

行转列(列转行)

#示例3
cat file4
	a bb  ccc   dddd   iiiii
	e fff kkkk  ggggg  oo     pp
	z xx  y     uuu


#列数固定
awk '{for(i=1;i<=NF;i++) a[NR,i]=$i}END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++){printf("%s ",a[j,i])};printf("\n")}}'  file4
	a e z 
	bb fff xx 
	ccc kkkk y 
	dddd ggggg uuu 

#列数不固定
 awk 'BEGIN{max=0}{if(NF>max) max=NF;for(i=1;i<=NF;i++) a[NR,i]=$i}END{for(i=1;i<=max;i++){for(j=1;j<=NR;j++){printf("%s ",a[j,i])};printf("\n")}}' file4
	a e z 
	bb fff xx 
	ccc kkkk y 
	dddd ggggg uuu 
	iiiii oo  
	 pp  
 

字段长度

#示例4
cat file3
	a bb  ccc   dddd  iiiii
	e fff kkkk  ggggg
	z xx  y     uuu

#输出一行
awk '{for(i=1;i<=NF;i++){printf("%s ",NR,length($i));}}' file3

#每个字段的长度(按行列排列返回)
#方式1:
awk '{x=1;for(i=1;i<=NF;i++){if(x!=NR){printf("\n%s ",length($i))}else printf("%s ",length($i));x=NR}}' file3
	1 2 3 4 5 
	1 3 4 5 
	1 2 1 3 
#方式2:需列数固定
 awk  '{for(i=1;i<=NF;i++) a[NR,i]=length($i)}END{for(j=1;j<=NR;j++){for(i=1;i<=NF;i++){printf("%s ",a[j,i])};printf("\n")}}' file3
	1 2 3 4 
	1 3 4 5 
	1 2 1 3 

定宽+空值处理

#待续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值