一直关注双色球彩票,也一直想对往期的数据作一个统计和排序之类的,看能不能利用概率的知识来对以后的开奖作出预测(当然从概率的发生事件来说,开出任何一场数字的概率的是平等的),预测也只能预测可能性大小;
于是做了以下工作:
首先把网上下载下来的数据作规则化处理(sed 去行),即让其排列规则,方便进行文本处理;
删除不要的数据,如期数;只留开奖数字,开奖时间(awk去列)
文本较大,先截取部分做试验(split,tail,head)
得到文本大致如下:
01,03,15,20,22,31|03 2012-11-04 01,07,09,17,21,29|01 2012-11-01 05,09,12,29,30,31|05 2012-10-30 01,09,11,21,26,32|08 2012-10-28 03,05,12,15,23,24|07 2012-10-25 08,12,13,26,29,33|01 2012-10-23 06,07,21,25,27,33|11 2012-10-21 08,10,16,25,28,33|09 2012-10-18 12,13,19,22,28,29|11 2012-10-16 01,07,08,20,23,24|11 2012-10-14
排序?如何排呢?逐行两两比较?像C语言中一样去进行,现在的数据可是以行为单位的,还要进行行的读取,这样下来好像比较复杂吧!如何截取数据也是一个难点。看来此法不通,既然是shell,一般脚本都不长,应该有其它方法,于是搜到了sort。之前python是以函数的形式存在的。
1、排序文本sort 命令
ORT(1) User Commands SORT(1)
NAME
sort - sort lines of text files
SYNOPSIS
sort [OPTION]... [FILE]...
sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。
如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。
-(减号)代替文件名指定标准输入。如果您不指定任何文件名,那么该命令对标准输入排序。可以使用 -o 标志指定输出文件。
如果不指定任何标志,sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序。
参数描述:
-A | 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。 | |
-b | 忽略前导空格和制表符,找出字段的第一或最后列。 | |
-c | 检查输入是否已按照标志中指定的排序规则进行排序。如果输入文件排序不正确,就返回一个非零值。 | |
-d | 使用字典顺序排序。比较中仅考虑字母、数字和空格。 | |
-f | 比较前将所有小写字母改成大写字母。 | |
-i | 比较中忽略所有非打印字符。 | |
-k KeyDefinition | 指定排序关键字。KeyDefinition 选项的格式为: [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ] 排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。Modifier 变量的值可以是 b、d、f、i、n 或r。 修饰符与同一字母的标志等价。 |
|
-m | 只合并多个输入文件;假设输入文件已经排序。 | |
-n | 按算术值对数字字段排序。数字字段可包含前导空格、可选减号、十进制数字、千分位分隔符和可选基数符。对包含任何非数字字符的字段进行数字排序会出现无法预知的结果。 | |
-o OutFile | 将输出指向 OutFile 参数指定的文件,而不是标准输出。OutFile 参数值可以与File 参数值相同。 | |
-r | 颠倒指定排序的顺序。 | |
-t Character | 指定 Character 为单一的字段分隔符。 | |
-u | 禁止按照排序关键字和选项的所有等同排序(每一组行中一行除外)。 | |
-T Directory | 将创建的所有临时文件放入 Directory 参数指定的目录中。 | |
-y[Kilobytes] | 用 Kilobytes 参数指定的主存储的千字节数启动 sort 命令,并根据需要增加存储量。(如果Kilobytes 参数指定的值小于最小存储站点或大于最大存储站点,就以这个最小存储站点或最大存储站点取代)。如果省略-y 标志,sort 命令以缺省的存储大小启动。-y0 标志用最小存储启动,而-y 标志(不带Kilobytes 值)用最大存储启动。sort 命令使用的存储量显著地影响性能。以大存储量对小文件排序将很浪费。 | |
-z RecordSize | 如果正在排序的任一行大于缺省的缓冲区大小,要防止出现异常终止。指定 -c 或 -m 标志时,省略排序阶段,使用系统的缺省缓冲大小。如果已排序行超出这一大小,排序异常终止。-z 选项指定排序阶段最长行的记录,因而可在合并阶段分配足够的缓冲区。RecordSize 必须指明等于或大于要合并的最长行的字节值。 |
例子:以默认方式排序:sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序
yee@Loong:~/lottery$ cat b.txt 01,03,15,20,22,31|03 2012-11-04 01,07,09,17,21,29|01 2012-11-01 05,09,12,29,30,31|05 2012-10-30 01,09,11,21,26,32|08 2012-10-28 03,05,12,15,23,24|07 2012-10-25 08,12,13,26,29,33|01 2012-10-23 06,07,21,25,27,33|11 2012-10-21 08,10,16,25,28,33|09 2012-10-18 12,13,19,22,28,29|11 2012-10-16 01,07,08,20,23,24|11 2012-10-14 yee@Loong:~/lottery$ sort b.txt 01,03,15,20,22,31|03 2012-11-04 01,07,08,20,23,24|11 2012-10-14 01,07,09,17,21,29|01 2012-11-01 01,09,11,21,26,32|08 2012-10-28 03,05,12,15,23,24|07 2012-10-25 05,09,12,29,30,31|05 2012-10-30 06,07,21,25,27,33|11 2012-10-21 08,10,16,25,28,33|09 2012-10-18 08,12,13,26,29,33|01 2012-10-23 12,13,19,22,28,29|11 2012-10-16 yee@Loong:~/lottery$
UNIQ(1) User Commands UNIQ(1)
NAME
uniq - report or omit repeated lines
SYNOPSIS
uniq [OPTION]... [INPUT [OUTPUT]]
DESCRIPTION
Discard all but one of successive identical lines from INPUT (or standard input), writing to
OUTPUT (or standard output).
文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。
语法:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
实练:
Loong:/home/yee/lottery# cat b.txt
08,12,13,26,29,33|01 2012-10-23
06,07,21,25,27,33|11 2012-10-21
08,10,16,25,28,33|09 2012-10-18
12,13,19,22,28,29|11 2012-10-16
01,07,08,20,23,24|11 2012-10-14
06,07,21,25,27,33|11 2012-10-21
06,07,21,25,27,33|11 2012-10-21
08,10,16,25,28,33|09 2012-10-18
06,07,21,25,27,33|11 2012-10-21
Loong:/home/yee/lottery# uniq -d b.txt 只比较相邻的行
06,07,21,25,27,33|11 2012-10-21
Loong:/home/yee/lottery# uniq -cd b.txt
2 06,07,21,25,27,33|11 2012-10-21 比较相邻的行,并输出重复次数
Loong:/home/yee/lottery# uniq -c b.txt
1 08,12,13,26,29,33|01 2012-10-23
1 06,07,21,25,27,33|11 2012-10-21
1 08,10,16,25,28,33|09 2012-10-18
1 12,13,19,22,28,29|11 2012-10-16
1 01,07,08,20,23,24|11 2012-10-14
2 06,07,21,25,27,33|11 2012-10-21
1 08,10,16,25,28,33|09 2012-10-18
1 06,07,21,25,27,33|11 2012-10-21
Loong:/home/yee/lottery# sort b.txt|uniq -c 检查全文重复次数
1 01,07,08,20,23,24|11 2012-10-14
4 06,07,21,25,27,33|11 2012-10-21
2 08,10,16,25,28,33|09 2012-10-18
1 08,12,13,26,29,33|01 2012-10-23
1 12,13,19,22,28,29|11 2012-10-16
Loong:/home/yee/lottery#
3、文本的提取
cut命令
cut命令可以从一个文本文件或者文本流中提取文本列。
cut [选项]… [文件]…
选项说明:
-b, –bytes=LIST 以字节为单位取出固定字节区间
-c, –characters=LIST 以字符为单位取出固定字符区间
-d, –delimiter=DELIM 指定分隔符来代替默认的TAB分隔符 wc -l $file|cut -d " " -f1 以空格为分割截取;wc统计行数
-f, –fields=LIST 依据 -d 指定的分隔符将一段内容分割成为数段,用 -f 取出第几段的意思 echo $line|cut -d: -f3 以冒号为分隔进行截取
-n with -b: 不分隔多字节字符
–complement 补充选定的字节,字符集或字段
-s, –only-delimited 不打印不包含分隔符的行
–output-delimiter=STRING 使用String 作为输出分隔符,默认的是使用输入分隔符
Loong:/home/yee/lottery# cut -c 12- b.txt
,29,33|01 2012-10-23
,27,33|11 2012-10-21
,28,33|09 2012-10-18
,28,29|11 2012-10-16
,23,24|11 2012-10-14
,27,33|11 2012-10-21
,27,33|11 2012-10-21
,28,33|09 2012-10-18
,27,33|11 2012-10-21
Loong:/home/yee/lottery# cut -c 12-17 b.txt
,29,33
,27,33
,28,33
,28,29
,23,24
,27,33
,27,33
,28,33
,27,33
Loong:/home/yee/lottery#
4、read
语法
read [options]
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志,会举例说 明。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以时候命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。