awk去重

本例循序渐进演示awk去重的各种功能
例如某1og 或txt下具有如下格式的文本(暂定文本名为test.log)

16:12:35 siteId 3333338732 siteName a11
16:12:36 siteId 4333338732 siteName b22
16:12:38 siteId 3333338732 siteName a11
16:12:39 siteId 3333338732 siteName a11
16:12:40 siteId 5333338732 siteName c33
16:12:41 siteId 4333338732 siteName b22
16:12:56 sisdeId 3333338732 siteName a11
16:12:77 siddteId 3333338732 siteName a11
16:12:88 sitseId 3333338732 siteName a11
16:12:99 sidddteId 3333338732 siteName a11
16:12:101 sitxxxxxxeId 3333338732 siteName 


1. 以空格作为域,截取 3列 以后的字符展示 (如果是制表符 即为 d\t)
1,cut -d" " -f 3- test.log 


执行命令之后结果为:

siteId 3333338732 siteName a11
siteId 4333338732 siteName b22
siteId 3333338732 siteName a11
siteId 3333338732 siteName a11
siteId 5333338732 siteName c33
siteId 4333338732 siteName b22
sisdeId 3333338732 siteName a11
siddteId 3333338732 siteName a11
sitseId 3333338732 siteName a11
sidddteId 3333338732 siteName a11
sitxxxxxxeId 3333338732 siteName a11




2.根据列名,截取特定行,然后输出
cut -d" " -f 3- test.log|awk '{if($1=="siteId" && $3=="siteName"{print $0}}'



结果如下
siteId 3333338732 siteName a11
siteId 4333338732 siteName b22
siteId 3333338732 siteName a11
siteId 3333338732 siteName a11
siteId 5333338732 siteName c33
siteId 4333338732 siteName b22


注意 awk中的 列是截取之后的。此时的siteId 为第一列了。

3.统计某重复行出现的次数,并输出去重后的每行, 截取特定的列 显示的时候用空格
less test.log |awk '{if($3=="siteId" && $5=="siteName"){a[$4" "$5" "$6]++}} END {for (j in a) print a[j],j}'


结果如下:
1 5333338732 siteName c33
2 4333338732 siteName b22
3 3333338732 siteName a11




4.将结果倒序输出less test.log |awk '{if($3=="siteId" && $5=="siteName"){a[$4" "$5" "$6]++}} END {for (j in a) print a[j],j}' |sort -rn

3 3333338732 siteName a11
2 4333338732 siteName b22
1 5333338732 siteName c33

猜你喜欢

转载自lhkzyz.iteye.com/blog/1668366
awk