shell脚本:统计订单信息

原创 2015年10月12日 15:03:49

今天跟一同事聊天,他面试时,被问到这么一个问题。

基本需求

请写一个shell脚本实现以下功能:在一个日志文件中,存放着用户名和订单交易额,请输出交易次数最多的用户名。
其日志文件大致如下:

FAN:12
LI:34
FAN:21
FAN:45
LI:123

其中第一列表示用户名,第二列表示交易额,列于列之间通过”:”隔开。
这个问题可以通过一行shell代码就可以实现。
解题思路:
需要将第一列数据取出来,然后统计出重复的个数,然后降序排列,取出第一个就可以。
代码如下:

#!/bin/bash
cat log | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr | head -1 | awk '{print $2}'

代码解释:

  • awk -F “:” ‘{print $1}’
    按照”:”作为分隔符,取出第一列数据。 -F 表示field-seperator
  • sort
    这个为下一步的uniq做准备。使一样的用户名排在相邻行,默认是按升序排列。
  • uniq -c
    去除重复行,并统计重复的行数。uniq命令默认是相邻行去重,因此需要去重。其输出结果如下:
    这里写图片描述
    对于uniq这个命令,-d(duplicate)表示仅显示重复行,-u(unduplicate)仅显示非重复行
    这里写图片描述
  • sort -nr
    按照数值大小降序排列。sort命令默认情况下是按照字符大小进行排序,即出现10<2的情况,因为’1’<’2’。使用-n参数使数值按照整数对待。sort命令默认按照升序进行排序,-r(reverse)参数表示按降序排列。
  • head -1
    取头上第一行。
  • awk ‘{print $2}’
    打印出用户名,这里之所以写成2是因为,uniq -c这个的输出第一列表示统计的重复的行数,第二列才是用户名。

扩展一

输出交易次数最多的用户对应的交易额。
解题思路:
上一步已经找到这个用户,下面需要将这个用户的记录全部找出来,然后将每次的交易额累加起来。
代码实现如下:

#!/bin/bash
name=`cat log | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr | head -1 | awk '{print $2}'`
#name=$(cat log | awk -F ":" '{print $1}' | sort | uniq -dc | sort -nr | head -1 | awk '{print $2}')
#echo ${name}
result=`cat log | grep ${name} | awk -F ":" '{print $2}' | awk '{sum+=$1} END {print sum}'`
echo ${name} ${result}

代码解释:
(1)要给变量赋值,要么使用符号“将命令围住,要么使用$()。

(2)cat log | grep ${name}
从log文件中只抽取出,上一步中找到的用户名相关记录。

(3)awk -F “:” ‘{print $2}’
得到这个用户的所有交易额

(4)awk ‘{sum+=$1} END {print sum}’
将用户的所有交易额累加

扩展二

有的时候交易次数最多的总交易额未必最多。如这个log文件中,LI的交易次数少,但是其交易额多。现在需要找出交易额最多的用户名,及其总交易额。
解题思路:
首先需要得到所有用户的用户名,然后逐个算出每个用户的总交易额,然后求出最大的,就OK了。这里,用户名数组和总交易额数组,其下标是对应的。如:userName[0]中存放的是用户名,则userTrading[0]存放的是这个用户的总交易额。
代码如下:

#!/bin/bash
userName=($(cat log | awk -F ":" '{print $1}' | sort | uniq))
length=${#userName[*]}
#for user in ${userName[@]}
#do
#  echo ${user}
#done
i=0
max=0
while [ $i -lt ${length} ]
do
  userTrading[$i]=`cat log | grep ${userName[$i]} | awk -F ":" '{print $2}' | awk '{sum+=$1} END {print sum}'`
  if [ ${userTrading[$max]} -lt ${userTrading[$i]} ] 
  then
    max=$i
  fi
  i=$(($i+1))
done
echo ${userName[$max]} ${userTrading[$max]}

代码解释:
(1)将shell命令的执行结果存放到数组中

userName=($(cat log | awk -F ":" '{print $1}' | sort | uniq))

shell脚本的语法可谓奇葩,有的时候很随意,有的时候很严格,得到数组必须要这么写。
其执行结果如下所示:
这里写图片描述
(2)得到数组的长度

length=${#userName[*]}
#length=${#userName[@]}

这里写图片描述
上面两种写法都可以。
(3)while循环
在上例中实现了两种循环,一种是for循环,得到数组中的内容,另一种是while循环,按照下标去访问。

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用hadoop实现关联商品统计

根据超市的销售清单,采用hadoop中的mapreduce计算商品之间的关联程度(即统计同时买A商品和B商品的次数)...
  • xiaojimanman
  • xiaojimanman
  • 2014年10月17日 14:03
  • 1738

INVALID_PARAMETER 订单信息无法识别,建议联系卖家。 支付宝

1.先检查金额是否精确到小数点后两位 2.检查参数json格式是否正确 还有其他可能麻烦回帖告知...
  • yaoxiewan6617
  • yaoxiewan6617
  • 2017年06月10日 14:08
  • 2351

linux运用shell脚本统计列出目录文件个数(学习笔记)

Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。 列出文件 ls -l 然后要统计文件有多...
  • lx_axiao
  • lx_axiao
  • 2017年04月09日 23:32
  • 1036

订单信息

activity_main布局
  • AnGuoEr3344
  • AnGuoEr3344
  • 2017年11月22日 18:50
  • 55

shell脚本统计出日志文件操作以及其对应的平均时间

有如下日志:exmple.log time: 1.236 operation:查询 time: 2.135 operation:处理 time: 3.741 operation:处理 time: ...
  • gongdaxuesheng
  • gongdaxuesheng
  • 2015年08月05日 18:59
  • 821

使用shell脚本和系统日志来统计并发数

cat www_access.log |grep "/message/savemsg/" >www.log   将包含该字段的/message/savemsg/的行写到www.log文件中 cat...
  • gzh0222
  • gzh0222
  • 2012年05月18日 15:07
  • 1980

保存订单信息

名称 SaveOrderInfo保存订单信息 描述 保存订单,包含自定义字段,只需设置参数中token和orderUdf模板 接口地址 Order/SaveOrderInfo H...
  • mike_ho
  • mike_ho
  • 2016年09月30日 10:35
  • 304

shell脚本检查统计nginx访问日志access.log

1、统计nginx的访问日志,统计访问总数,http状态码信息等 思路:先将access.log日志中的http状态码取出来,在我的nginx.conf配置下,access.log中一般awk ‘{...
  • heshan307
  • heshan307
  • 2016年08月29日 23:10
  • 2320

保存完订单会造成乱码,怎样找出问题在哪里的步骤

1.今天在做订单保存的时候,用户名称会乱码,所以领导吧这个任务交给我了 2.那我首先得话,需要判断到底是哪一步造成乱码了。因为这个是别人的代码。我是不了解的 3.是前台,后台,数据库这三个地方哪里...
  • rendeyishi
  • rendeyishi
  • 2015年01月07日 15:21
  • 1012

Linux下统计某个目录下所有源代码行数的Shell脚本;

由于要统计某个源代码下的所有代码的行数,所以这里自己写了个脚本来完成这个功能。我在编写这个脚本的时候,遇到了一些问题,我先把代码贴在这里;使用方法,将此脚本文件存为linesNumber.sh,使用时...
  • baymoon
  • baymoon
  • 2007年01月11日 13:18
  • 5590
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell脚本:统计订单信息
举报原因:
原因补充:

(最多只允许输入30个字)