awk tricks

初始入门

cat awk.txt
Item1,200
Item2,500
Item3,900
Item2,800
Item4,500
Item1,400
Item2,200
Item3,700
Item4,800
Item1,600
  • 第二列求和
awk -F","'{x+=$2}END{print x}' awk.txt
5600
  • 对某个Item求和
awk -F,'$1=="Item1"{x+=$2;}END{print x}' awk.txt
1200
  • 去重
awk -F, '{a[$1];}END{for (i in a)print i;}' awk.txt
Item1
Item2
Item3
Item4
  • 分组求和sum
awk -F,'{a[$1]+=$2;}END{for(i in a)print i", "a[i];}' awk.txt
Item1, 1200
Item2, 1500
Item3, 1600
Item4, 1300
  • 分组max
awk -F, '{if (a[$1] < $2)a[$1]=$2;}END{for(i in a){print i,a[i];}}' OFS=, awk.txt
Item1,600
Item2,800
Item3,900
Item4,800
  • 分组count
awk -F, '{a[$1]++;}END{for(i in a)print i, a[i];}' awk.txt
Item1 3
Item2 3
Item3 2
Item4 2
  • 分组拼接
awk -F,'{if(a[$1])a[$1]=a[$1]" "$2;else a[$1]=$2;}END{for(i in a) printi,a[i]}' OFS='\t' awk.txt
Item1       200  400  600
Item2       500  800 200
Item3       900  700
Item4       500  800
  • 取第二行开始,每隔3行的数据
awk 'BEGIN{i=2} {if(NR==i) {print substr($0, 2, length($0)-2); i+=3}}' ok.txt
Item2,500
Item4,500
Item3,700

其他用法

  • 删除每行起始的空白
awk '{ sub(/^[ \t]+/, ""); print }'
  • 删除每行结尾的空白
awk '{ sub(/[ \t]+$/, ""); print }'
  • 删除每行收尾的空白
awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }'
  • 删除空白行
awk 'NF'
awk 'NF > 0'
awk '!/^$/'
awk '/./'
  • 删除每行的第二个字段
awk '{ $2 = ""; print }'
  • 每隔n行插入空行
awk '{ if ((NR % 5) == 0) printf("\n"); print; }'
  • 抽取指定范围的行
awk 'NR >= 10 && NR <= 20'
  • 替换分隔符
awk '$1=$1' FS="----" OFS=","
awk 'gsub("----",",")'
  • 找出匹配的子串
awk '{match($0,"a*f"); print substr($0,RSTART)}'
echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}'
  • 写入多个文件
awk '{print >> ("filename"$1)}'
  • 计算调用方法耗时
tail -100000 performance.log | awk -F '-' '{print substr($2, 2, length($2) - 3)}' | awk '/^com/ {print $0}' | awk -F '=' '{a[$1]+=$2; b[$1]++;}END{for(i in a){print i, b[i], a[i] / b[i];}}' | sort -n -k 3 -r
  • 过滤
awk '/l*c/{print}' /etc/localhost
  • 两个文件join
cat a.txt   
111 org  
222 edu  
333 gov   
444 net   

cat b.txt   
111 Tom Green.  
444 Ani Teen.  
888 Dany Cross.   

结果要求  
----------------------------------------------------  
111--org--Tom--Green.  
444--net--Ani--Teen.  
----------------------------------------------------  
awk -v OFS='--' 'NR==FNR {a[$1]=$2}; NR!=FNR && a[$1]{print $1, a[$1], $2, $3}' a.txt b.txt   

FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值