初始入门
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重新累计。

被折叠的 条评论
为什么被折叠?



