一直关注双色球彩票,也一直想对往期的数据作一个统计和排序之类的,看能不能利用概率的知识来对以后的开奖作出预测(当然从概率的发生事件来说,开出任何一场数字的概率的是平等的),预测也只能预测可能性大小;

于是做了以下工作:

首先把网上下载下来的数据作规则化处理(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 变量的值可以是 bdfinr。 修饰符与同一字母的标志等价。

 -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$ 

2、uniq 文本去重


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 [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。

 -c或--count   在每列旁边显示该行重复出现的次数。
  -d或--repeat ed   仅显示重复出现的行列。
  -f<栏位>或--skip-fields=<栏位>   忽略比较指定的栏位。
  -s<字符位置>或--skip-chars=<字符位置>   忽略比较指定的字符。
  -u或--unique   仅显示出一次的行列。
  -w<字符位置>或--check-chars=<字符位置>   指定要比较的字符。
  --help   显示帮助。
  --version   显示版本信息。

实练:

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 作为输出分隔符,默认的是使用输入分隔符

  • 仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔   
  • 开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。   
  • 每种参数格式表示范围如下:                                          -c, –characters=LIST 以字符为单位取出固定字符区间  即与 -c 搭配使用
  •  N    从第1 个开始数的第N 个字节、字符或域   
  •  N-    从第N 个开始到所在行结束的所有字符、字节或域   
  •  N-M    从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域   
  •  -M    从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域 

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新开启的。

posted on 2022-07-05 18:13  我在全球村  阅读(131)  评论(0编辑  收藏  举报