基于linux系统下处理大数据的解决方案
任务:
今天收到了一个日本商店集团的1969843条数据,任务是查出重复出现的编码数据并给出其行数。
方法:
利用linux系统的终端中script,cut,grep,sort,uniq 命令解决解决
介绍script命令:
script是一个神奇命令,可以使用script工具记录用户在当前终端的所有的操作,已经输出到屏幕的内容。将这些信息保存到指定的文本文件中。也就是说,script命令在你需要记录或者存档终端活动时可能很有用,记录文件会存储为文本文件,所以可以很方便地用文本编辑器打开。
- 直接输入script,不加file选项的时候,开始记录终端的操作行为,并将操作内容输出到当前目录的typescript中(也是解决本次任务的使用方法)
- -a选项,在现有输出录制的文件的内容上追加新的内容
- -c选项,后面可以加上需要执行的命令,而不是交互式shell上执行的命令
- -r选项,子进程中返回退出代码
- -f选项,如果需要在输出到日志文件的同时,也可以查看日志文件的内容,可以使用 -f 参数。PS:可以用于教学,两个命令行接-f可以实时演示
- -q选项,可以使script命令以静默模式运行
- -t选项,指明输出录制的时间数据
- -v选项,输出script的版本信息,然后退出
- -h选项,输出script的help信息,然后退出
shihaoyang@No-error:~$ script -help
用法:
script [选项] [文件]
创建终端会话的 typescript。
选项:
-a, --append append the output
-c, --command <command> run command rather than interactive shell
-e, --return return exit code of the child process
-f, --flush run flush after each write
--force use output file even when it is a link
-o, --output-limit <size> terminate if output files exceed size
-q, --quiet be quiet
-t[<file>], --timing[=<file>] output timing data to stderr or to FILE
-h, --help display this help
-V, --version display version
更多信息请参阅 script(1)。
介绍cut命令:
- cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -c :以字符为单位进行分割。
- -d :自定义分隔符,默认为制表符。
- -f :与-d一起使用,指定显示哪个区域。
- -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除。
shihaoyang@No-error:~$ cut --help
用法:cut [选项]... [文件]...
Print selected parts of lines from each FILE to standard output.
如果没有指定文件,或者文件为"-",则从标准输入读取。
必选参数对长短选项同时适用。
-b, --bytes=列表 只选中指定的这些字节
-c, --characters=列表 只选中指定的这些字符
-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界
-f, --fields=列表 只选中指定的这些域;并打印所有不包含分界符的
行,除非-s 选项被指定
-n (忽略)
--complement 补全选中的字节、字符或域
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入
的分界符
-z, --zero-terminated 以 NUL 字符而非换行符作为行尾分隔符
--help 显示此帮助信息并退出
--version 显示版本信息并退出
仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔
开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。
Each range is one of:
N N'th byte, character or field, counted from 1
N- from N'th byte, character or field, to end of line
N-M from N'th to M'th (included) byte, character or field
-M from first to M'th (included) byte, character or field
介绍grep命令:
- Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的打印出来。grep全称是global regular expression print(全面搜索正则表达式并行打印)
- grep的工作方式:它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
- -a, --text #等同于 --binary-files=text
- -b, --byte-offset #在每行输出之前,在输入文件中打印基于0的字节偏移量
- -c, --count #打印符合PARRERN的行数
- -d, --directories=ACTION #读取目录的方式;ACTION 可以是
read',
recurse’,或`skip’ - -D, --devices=ACTION #读取设备、先入先出队列、套接字的方式;ACTION 可以是
read'或
skip’ - -e, --regexp=PATTERN #用 PATTERN 来进行匹配操作
- -E, --extended-regexp #将PATTERN解释为扩展正则表达式
- -f, --file=FILE #从 FILE 中读取PATTERN
- -F, --fixed-strings #将PATTERN解释为固定字符串的列表
- -G, --basic-regexp #将PATTERN解释为基本的正则表达式
- -h, --no-filename #在每行输出之前,不打印该行所属的文件名称
- -H, --with-filename #在每行输出之前,打印该行所属的文件名称
- -i, --ignore-case #忽略大小写
- -I #列出符合查找内容的文件名称
- -l, --files-with-matches #列出文件内容符合指定PARRERN的文件名称
- -L, --files-without-match #列出文件内容不符合指定PARRERN的文件名称
- -m, --max-count=NUM #在匹配行NUM之后停止读取文件
- -n, --line-number #在每行输出之前,打印输入文件中的从1开始的行号。
- -o, --only-matching #只显示匹配PATTERN 部分
- -P, --perl-regexp #将PATTERN解释为Perl正则表达式,
- -q, --quiet, --silent #不显示任何信息
- -s,–no-messages #不显示错误信息
- -T, --initial-tab #确保实际行内容的第一个字符位于制表位上,以便制表符对齐看起来正常。
- -V, --version #打印grep的版本号,然后退出
- -w, --word-regexp #只选择包含构成全词匹配的那些行。
- -x, --line-regexp #只选择完全匹配整行的匹配项
- –binary-files=TYPE #设定二进制文件的TYPE 类型
shihaoyang@No-error:~$ grep --help
用法: grep [选项]... 模式 [文件]...
在每个<文件>中查找给定<模式>。
例如:grep -i 'hello world' menu.h main.c
<模式>可以包括多个模式字符串,使用换行符进行分隔。
模式选择与解释:
-E, --extended-regexp <模式> 是扩展正则表达式
-F, --fixed-strings <模式> 是字符串
-G, --basic-regexp <模式> 是基本正则表达式
-P, --perl-regexp <模式> 是 Perl 正则表达式
-e, --regexp=<模式> 用指定的<模式>字符串来进行匹配操作
-f, --file=<文件> 从给定<文件>中取得<模式>
-i, --ignore-case 在模式和数据中忽略大小写
--no-ignore-case 不要忽略大小写(默认)
-w, --word-regexp 强制<模式>仅完全匹配字词
-x, --line-regexp 强制<模式>仅完全匹配整行
-z, --null-data 数据行以一个 0 字节结束,而非换行符
杂项:
-s, --no-messages 不显示错误信息
-v, --invert-match 选中不匹配的行
-V, --version 显示版本信息并退出
--help 显示此帮助并退出
输出控制:
-m, --max-count=<次数> 得到给定<次数>次匹配后停止
-b, --byte-offset 输出的同时打印字节偏移
-n, --line-number 输出的同时打印行号
--line-buffered 每行输出后刷新输出缓冲区
-H, --with-filename 为输出行打印文件名
-h, --no-filename 输出时不显示文件名前缀
--label=<标签> 将给定<标签>作为标准输入文件名前缀
-o, --only-matching 只显示行中非空匹配部分
-q, --quiet, --silent 不显示所有常规输出
--binary-files=TYPE 设定二进制文件的 TYPE(类型);
TYPE 可以是 'binary'、'text' 或 'without-match'
-a, --text 等同于 --binary-files=text
-I 等同于 --binary-files=without-match
-d, --directories=ACTION 读取目录的方式;
ACTION 可以是`read', `recurse',或`skip'
-D, --devices=ACTION 读取设备、先入先出队列、套接字的方式;
ACTION 可以是`read'或`skip'
-r, --recursive 等同于--directories=recurse
-R, --dereference-recursive 同上,但遍历所有符号链接
--include=GLOB search only files that match GLOB (a file pattern)
--exclude=GLOB skip files that match GLOB
--exclude-from=FILE skip files that match any file pattern from FILE
--exclude-dir=GLOB skip directories that match GLOB
-L, --files-without-match 只打印没有匹配上的<文件>的名称
-l, --files-with-matches 只打印有匹配的<文件>的名称
-c, --count 只打印每个<文件>中的匹配行数目
-T, --initial-tab 行首制表符对齐(如有必要)
-Z, --null 在<文件>名最后打印空字符
文件控制:
-B, --before-context=NUM 打印文本及其前面NUM 行
-A, --after-context=NUM 打印文本及其后面NUM 行
-C, --context=NUM 打印NUM 行输出文本
-NUM 等同于 --context=NUM
--color[=WHEN],
--colour[=WHEN] 使用标记高亮匹配字串;
WHEN 可以是“always”、“never”或“auto”
-U, --binary 不要清除行尾的 CR 字符(MSDOS/Windows)
介绍sort uniq命令:
- sort 用于排序文本数据。该数据可以位于文件中或其他命令输出中。 Sort 通常与uniq一起使用
- uniq“ 删除 ”文件中重复的相邻行。若要只打印文件中出现的唯一行(“ 删除 ”所有重复行 ), 必须首先对uniq 的输入进行排序。由于可以为uniq 指定其决策所基于的字段或列 , 因此这些字段或列是对其输入进行排序所必须的字段或列。如果未与选项一起使用 , uniq 会使用整个记录作为决策键 , 删除其输入中的重复行
sort /文件名
-n ##纯数字排序升序
-rn ##纯数字排序降序
-u ##去冗余
|uniq -c ##去除冗余并统计冗余次数
-t ##指定分隔符
-k ##指定列
sort file |uniq -c ##去除冗余并统计冗余次数
-d ##显示冗余行
-u ##显示唯一行
解决方案:
- 由于该任务是存在日文的,日文存在英文字母由于不明其占位数以及字节我将其转为二进制格式,并截取95位到112位的18位商品信息数字
shihaoyang@No-error:~/task1$ script
脚本已启动,文件为 typescript ##存储18位的商品信息数字数据
shihaoyang@No-error:~/task1$ cut -nb 95-112 1.dat##截取商品信息数字
shihaoyang@No-error:~/task1$ exit ## 保存退出
脚本完成,文件为 typescript
然后需要找到该文件该其尾坠为.txt即可查看
shihaoyang@No-error:~/task1$ script
脚本已启动,文件为 typescript ##存储重复的18位的商品信息数字数据
shihaoyang@No-error:~/task1$ sort data.txt | uniq -d##显示重复的18位的商品信息数字数据
shihaoyang@No-error:~/task1$ exit
脚本完成,文件为 typescript
000000000000000001为重复的18位的商品信息数字数据
shihaoyang@No-error:~/task1$ grep -n "000000000000000001" data.txt##去查找重复的18位的商品信息数字数据的行数
1402723:000000000000000001
1969842:000000000000000001
最终的出重复数据为
10000080409000407900000000000038000003ニュウカビ ニュウカビ 000000000000000001000000000000100080000000000000000100YEN 99
10000080409000350100000000000035298465切り花 カヨウイチスポット 000000000000000001000000000047700100000000000000052400YEN 990000000000000000000