awk tricks

来源:互联网 发布:竞业限制补偿金算法 编辑:程序博客网 时间:2024/06/06 11:47

初始入门

cat awk.txtItem1,200Item2,500Item3,900Item2,800Item4,500Item1,400Item2,200Item3,700Item4,800Item1,600
  • 第二列求和
awk -F","'{x+=$2}END{print x}' awk.txt5600
  • 对某个Item求和
awk -F,'$1=="Item1"{x+=$2;}END{print x}' awk.txt1200
  • 去重
awk -F, '{a[$1];}END{for (i in a)print i;}' awk.txtItem1Item2Item3Item4
  • 分组求和sum
awk -F,'{a[$1]+=$2;}END{for(i in a)print i", "a[i];}' awk.txtItem1, 1200Item2, 1500Item3, 1600Item4, 1300
  • 分组max
awk -F, '{if (a[$1] < $2)a[$1]=$2;}END{for(i in a){print i,a[i];}}' OFS=, awk.txtItem1,600Item2,800Item3,900Item4,800
  • 分组count
awk -F, '{a[$1]++;}END{for(i in a)print i, a[i];}' awk.txtItem1 3Item2 3Item3 2Item4 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.txtItem1       200  400  600Item2       500  800 200Item3       900  700Item4       500  800
  • 取第二行开始,每隔3行的数据
awk 'BEGIN{i=2} {if(NR==i) {print substr($0, 2, length($0)-2); i+=3}}' ok.txtItem2,500Item4,500Item3,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重新累计。

1 0
原创粉丝点击