linux awk 按多列 去重 来统计数据之妙用

本文介绍了一种使用awk命令处理日志文件的方法,该方法能够帮助我们统计特定字段的出现次数并进行去重处理,适用于分析用户点击行为等场景。

这是我日常工作统计日志用到的,现记录下:

比如有这样一个日志:


 

需要统计push,的点击数量,按cookie去重,因为一个设备可能点击多次

 

第一步,先看看这几列,打印出来看看,

awk -F "," '{print $2" "$3" "$6" "$7" "$9}' pushLog.log

 

 

第二步,按上面的几列去重

awk -F ","  '!a[$2,$3,$6,$7,$9]++'  pushLog.log

 

 

第三步, 统计

awk -F ","  '!a[$2,$3,$6,$7,$9]++'  pushLog.log  |awk -F ","  '{a[$2" "$3" "$6" "$9]+=1}END{for(i in a) printf "%s %s\n",i,a[i]}' | sort -k 5 -n -r | head -n 15

 

结果如图:



 

 

<think>好的,我现在需要解决用户的问题:在Linux中按照第三列,并保留第二列最小的行。这个问题看起来是关于文本处理和数据筛选的。用户希望处理一个包含多列数据的文件,根据第三列的值,当有复的第三列时,保留第二列数值最小的那一行。 首先,我需要理解用户的需求。用户的数据可能是以某种分隔符(比如空格或制表符)分隔的文本文件,例如: ``` A 5 X B 3 Y C 2 X D 4 Y ``` 在这个例子中,第三列是X和Y。按照第三列的话,每个X和Y只保留一行。同时,如果有多个相同的第三列,需要保留第二列数值最小的行。例如,对于第三列X,对应的第二列是5和2,所以保留第二列更小的C 2 X这一行,而不是A 5 X。类似地,Y对应的第二列是3和4,所以保留B 3 Y。 接下来,我需要思考如何在Linux中实现这个需求。常见的文本处理工具有awk、sort、uniq等。其中,awk非常适合处理列数据,sort可以排序,而uniq用于,但uniq通常只能处理相邻的复行,所以可能需要结合排序和awk来处理。 可能的步骤是: 1. 首先将数据按照第三列排序,这样相同第三列的行会集中在一起。 2. 对于每个第三列的分组,找到第二列最小的行。 3. 输出这些行。 但具体怎么实现呢?可能需要使用awk来跟踪每个第三列的最小值和对应的行。或者使用sort先按第三列分组,再按第二列排序,然后保留每个组的第一行或最后一行,取决于排序方式。 比如,假设先按第三列排序,然后按第二列升序排列。这样,每个第三列分组中的第一行就是第二列最小的行。之后,可以使用awk来输出每个第三列的第一次出现的行。 例如,使用sort命令先按第三列(-k3)排序,再按第二列数值排序(-k2n)。然后使用awk处理,当第三列的值变化时,输出该行。 但具体实现可能需要更详细的步骤。例如: 假设数据文件是data.txt,列之间用空格或制表符分隔。命令可能如下: sort -k3,3 -k2,2n data.txt | awk '!seen[$3]++' 这里,sort先按第三列(-k3,3)排序,然后按第二列数值升序(-k2,2n)。这样,对于每个第三列,第二列最小的行会排在前面。然后,通过awk命令,当第三列第一次出现时记录并输出,后续复的第三列行则被忽略。 不过,这样的方法是否正确?假设sort后的数据是按第三列分组,每组内按第二列从小到大排列,那么每个第三列的第一次出现就是最小的行,这时候使用awk的'!seen[$3]++'会保留每个第三列的第一行,即第二列最小的行。这样应该可以达到目的。 但是,是否应该考虑不同的分隔符?比如,如果列是用逗号或其他符号分隔,需要指定sort和awk的分隔符。默认情况下,sort和awk使用空白作为分隔符,但如果数据中有其他分隔符,比如逗号,就需要使用-F选项指定。 例如,如果是CSV文件,分隔符是逗号,那么命令应该调整为: sort -t',' -k3,3 -k2,2n data.csv | awk -F',' '!seen[$3]++' 此外,需要确保数据中的列顺序是正确的。用户的问题中提到“第三列”和“第二列”,所以假设列的顺序是固定的,比如第1列、第2列、第3列等。 可能的测试案例: 测试文件data.txt内容: A 5 X B 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值