Contents
  1. 1. Bash脚本文件的Unix格式问题
  2. 2. 数据处理
    1. 2.1. 得到所有的用户id
    2. 2.2. 得到所有的日期
    3. 2.3. 批量得到各用户id的并按日期排序后的数据结果
    4. 2.4. 批量得到各日期的并按用户id排序后的数据结果
    5. 2.5. 统计各日期的所有用户的总购买量和总申购量

仍然是余额宝的申购赎回数据的预处理。

Bash脚本文件的Unix格式问题

在Windows下使用Cygwin提供的Unix环境,用Notepad++编辑Shell脚本时,总是提示碰到类似”未预期的符号 `$’do\r’’ 附近有语法错误
“。直到搜到《notepad++写shell语句时执行错误》(http://www.2cto.com/os/201411/350875.html),才发现原来是系统间换行符和回车符的差别(http://blog.chinaunix.net/uid-26404201-id-3082677.html),晕死!虽然在书上屡屡见到这个说法,自己还是第一次碰到,涨姿势……

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”。


数据处理

得到所有的用户id

1
$ awk -F, 'NR>1{print $1}' data/user_balance_table.csv | sort -g -u > user/users

数据文件data/user_balance_table.csv每行以逗号分割列项(-F,),跳过第一行表头(NR>1),输出第一列所有用户id(print $1),再根据用户id的数字值大小(-g)去重复(-u)排序。

得到所有的日期

1
$ awk -F, 'NR>1{print $2}' data/user_balance_table.csv | sort -u > date/dates

数据文件data/user_balance_table.csv每行以逗号分割列项(-F,),跳过第一行表头(NR>1),输出第二列所有日期(print $2),再去重复(-u)排序。


批量得到各用户id的并按日期排序后的数据结果

1
2
3
4
5
6
7
#!/bin/bash
for LINE in `cat user/users`
do
command="awk -F, '\$1==$LINE{print \$0;}' data/user_balance_table.csv | sort -k 2 -t, > user/$LINE"
`eval $command`
echo "user $LINE is done"
done

逐行读取用户id(for……),组合相应的命令字符串(command……)并执行该命令。
注意:

  • 在bash脚本中是用Esc下方的`符号包裹住表示执行命令
  • \$后接变量名表示调用,字符串中如果要显示美元符号,则必须用\进行转义
  • 利用eval command-line执行字符串命令。这是因为Shell会扫描两次该语句,第一次把字符串转换成命令,第二次执行命令。

批量得到各日期的并按用户id排序后的数据结果

1
2
3
4
5
6
7
#!/bin/bash
for LINE in `cat date/dates`
do
command="awk -F, '\$2==$LINE{print \$0;}' data/user_balance_table.csv | sort -k 2 -t, > date/$LINE"
`eval $command`
echo "user $LINE is done"
done

逐行读取日期(for……),组合相应的命令字符串(command……)并执行该命令。


统计各日期的所有用户的总购买量和总申购量

1
2
3
4
5
6
7
#!/bin/bash
for LINE in `cat date/dates`
do
command="awk -F, 'BEGIN{sum_purchase=0;sum_redeem=0;OFS=\",\"}\$2==$LINE{sum_purchase=sum_purchase+\$5;sum_redeem=sum_redeem+\$9}END{print $LINE,sum_purchase,sum_redeem}' data/user_balance_table.csv >> date/sum_dates"
`eval $command`
echo "date $LINE is done"
done

做出的 日期-购买量/申购量 统计图,有规律可循。
sum.png

Contents
  1. 1. Bash脚本文件的Unix格式问题
  2. 2. 数据处理
    1. 2.1. 得到所有的用户id
    2. 2.2. 得到所有的日期
    3. 2.3. 批量得到各用户id的并按日期排序后的数据结果
    4. 2.4. 批量得到各日期的并按用户id排序后的数据结果
    5. 2.5. 统计各日期的所有用户的总购买量和总申购量