看完上手——awk

测试文件:test.txt

内如如下:

1
2
3
4
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20

输入方式

1
2
3
4
5
# 通过管道
cat test.txt | awk '{print $0}'

# 文件放最后
awk '{print $0}' test.txt

分割字段

1
2
3
4
5
6
7
8
# $0表示整条记录,$1表示分割后的第一个字段
awk -F',' '{print $1}' test.txt

# 输出
1
6
11
16

过滤记录

  • 正则过滤 /regular/
1
2
3
4
5
awk '/9/{print $0}' test.txt

# 输出
6,7,8,9,10
16,17,18,19,20
  • 条件过滤
1
2
3
4
awk -F, '{if($1=="11") print $0}' test.txt

# 输出
11,12,13,14,15

常用变量

  • FS 字段分隔符 Field separator
  • NF 这条记录的总字段数
  • NR 第几条记录
1
2
3
4
5
6
7
8
# 输出的字符串,通过双引号引住
awk -F, '{print "这个是第"NR"行,这条记录共有"NF"个字段"}' test.txt

# 输出
这个是第1行,这条记录共有5个字段
这个是第2行,这条记录共有5个字段
这个是第3行,这条记录共有5个字段
这个是第4行,这条记录共有5个字段

循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
awk 'BEGIN {FS=","} {for(i=1; i<=NF;i++){print $i}}' test.txt

# 输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

计算平均数

1
2
3
4
awk -F, '{sum+=$1} END {print "Average = ", sum/NR}' test.txt

# 输出
Average = 8.5

去重

test文件增加几条记录

1
2
3
4
5
6
7
8
9
10
cat test.txt

# 输出
1,2,3,4,5
6,7,8,9,10
1,2,3,4,5
11,12,13,14,15
16,17,18,19,20
11,12,13,14,15
11,12,13,14,15
  • 去重输出
1
2
3
4
5
6
7
8
# 如果数组a不存在这一行,则打印
awk '{ if (!a[$0]++) { print $0; } }' test.txt

#输出
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20
  • 去重,并输出对应记录的重复数
1
2
3
4
5
6
7
awk '{a[$0]++}END{for(w in a){print w "出现次数为" a[w]}}' test.txt

# 输出
6,7,8,9,10出现次数为1
16,17,18,19,20出现次数为1
11,12,13,14,15出现次数为3
1,2,3,4,5出现次数为2
  • 本文作者:二当家的
  • 本文链接: 2020/01/01/看完上手——awk/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
  • 彩蛋: 左边Overview微信公众号二维码,扫描它获取更多技术信息