[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

LookLike 过滤/获取相似内容

本帖最后由 CrLf 于 2015-8-14 16:29 编辑

实际上是 jscript.net,用 jsc.exe 编译的,需要 .net 2.0 支持

源代码在此,可以直接以 jscript 脚本运行:

2014/06/20 修正了一个非常规数组赋值导致的排序异常问题,并用条件编译语句改写成既能编译又能作为 js 脚本运行的两栖源代码,作为脚本运行时效率会比 exe 低很多
2014/12/06 修正了两处异常,并添加 /Blank /Only /To 开关
---------------------------------------------------------------------------
jscript原形的基础上增加了许多开关
原理见搜索引擎技术:标题去重 如何快速判断两个字符串的相似度

帮助信息:
  1. Usage: LookLike.exe
  2. [/All] [/Uniq] [/Include] [/Length=Number]
  3. [/Format[=(chs|en|num|RegExp)]] /To=String
  4. [/Rate=Number] [/Series=Number]
  5. [/Get] [/Only] [/Blank] [/Verbose]
  6. [/Key=String] [[drive:][path]filename]
  7. [/Help] [/Debug]
  8.   All 不将输入的内容分行,将用整个文件进行比较
  9.   Uniq 开启后将排除每行内容里重复的分段
  10. 若分段长度为 4,则 1111211111.... 等价于 11112111
  11.   Include 过滤被包含项
  12.   Length=Number
  13. 将内容划分成指定长度的分段,Number 为大于 0 的正整数,默认为 4
  14.   Format[=(def|chs|en|num|RegExp)]
  15. 在判断前先将文件根据自定义的选项处理一遍,可选子参数含义为:
  16. def-基础规则   chs-简体中文   en-英文和数字   num-仅数字
  17. RegExp-捕获或替换一个正则表达式对应的内容
  18. 格式为 /pattern/mode,如指定了 /To 开关,则为替换
  19.   Rate[=Number]
  20. 自定义筛选阀值必须大于 0 小等于 1,若不设置 Number 则动态计算
  21.   Series[=Number]
  22. 过滤连续匹配次数超过阀值的内容,若不设置 Number 则动态计算
  23.   Get 将排除改为获取
  24.   Only 对相似行保留一行
  25.   Blank 不处理预处理后的为空的行
  26.   Verbose 显示详细信息,格式为:来源|行号|长度|原始字符串
  27.   Key=String 根据给定的字符串进行筛选,支持以 %var% 的格式解析变量
  28.   [drive:][path]filename
  29. 指定输入文件,如未指定则从管道或重定向输入获取内容
  30.   Help 显示帮助信息
  31.   Debug 用错误输出句柄显示调试信息
  32.   注:   一、如未用 Rate 和 Series 指定阀值,默认将动态计算,行越短则越严格:
  33. Rate = Math.sin(2/(Math.sqrt(length+5)))
  34. Series = 1/Math.sqrt(length+1)
  35.   二、在开关中,
  36. 1、前缀可用 / 或 -,如 /Help 等价于 -Help
  37. 2、开关名不分大小写且可简写为首字母,如 /Get 等价于 /get 和 /G
  38. 3、= 与 : 等价,如 /Length=4 等价于 /Length:4
  39. 4、开关如重复出现,只以最后一个为准
复制代码
示例代码:
  1. dir | LookLike
  2. ::从 dir 输出中获取不相似的行
  3. LookLike /get /include <输入.txt
  4. ::从 输入.txt 中获取相似的行和完全被其他行包含的行
  5. LookLike /get /verbose 输入1.txt 输入2.txt
  6. ::从 输入1.txt 和 输入2.txt 获取相似的行,并打印详细信息
  7. set "变量=一下"
  8. LookLike /format:chs /key=测试%%变量%% 输入.txt
  9. ::为简体中文进行预格式化,将中文标点、英文字符、数字等内容预先处理为空格
  10. ::然后以 "测试一下" 为关键词在 输入.txt 中搜索相似的行
  11. set "字符串=bbs.bathome.net"
  12. for %%a in (*.txt) do LookLike /k:%字符串% /f /g /u /i /s "%%a" >nul||echo 在 "%%a" 中找到和 %字符串% 的内容
  13. ::以 bbs.bathome.ne 为关键词,判断在 *.txt 中是否有相似的行
  14. ::自行发挥。。。。。。
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

1  感谢分享
2 你这个帖子有个重大bug,没有名词解释,何谓相似,何谓不相似。“abbbc” 和“abbc”相似么?论坛论坛,你得先说出论点,然后才说如何编程实现。你木有主题,谁知道相似是干嘛使得呢?这是你的缺点,我既然指出了,你就不要不承认。

3 作为脚本运行时效率会比 exe 低很多---对你这句我挺感兴趣,不知道证据在哪?你愿意详谈么?。net我略有了解。凡是用。net的,最终要调用。net类,用方法,属性。  

4 潜在的,我还有个疑惑,我心底认为你,【1 你认为。net太占内存。2你认为。net性能不如awk,sed】而今你竟然开始编写。net程序,古怪,古怪。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 CrLf 于 2014-6-20 17:25 编辑

回复 2# PowerShell


1、感谢关注~
---------------------------------------------------------------------------------------------------------
2、
     事实上,顶楼 4、5 两行的链接分别指向了本贴中“相似”的标准与算法实现,而且源代码中每块功能都有注释,应该把判定相似的依据都说清楚了
     延伸一下,相似是什么?
     monday 和 星期一 是否相似?碳60 与 60个碳原子是否相似?人与老鼠DNA相似度达90%,这又是否相似?a 与 aaaaaa 是否相似?窃以为相似是个逼近相同的概念,很多时候像不像得看角度,横看成岭侧成峰,只有更相似,没有最相似
     感觉楼上比较喜欢一棒子打死(此处无意攻击,如有冒犯,请见谅),但世界不是非黑即白,脚本好与不好也是没有分数线的,全看用在哪与怎么用
     扯远了,链接中楼主所要求的相似其实是“逼近相同,容忍范围尽量大”。让我想起齐白石对美的概述是“妙在似与不似之间”,按集合论的说法补集相加原本应为全集,那“似与不似之间”是什么呢?他的要求和“在似与不似之间”一样是理性上有矛盾但感性上可以理解的条件,既然非理性,那就没有一个准确的答案,只能找到一个“似与不似”的平衡点,就像老人摔倒要不要扶...个中微妙,难以言说,某些平衡点上 a 与 aaaaaa 相似,在其他平衡点上也许就不相似,但一定是谁错了吗?内事不决问百度、外事不决问谷歌,baidu 和 google 搜索引擎孰优孰劣能有定论吗?他们有向我们解释相似的标准吗?相似原本就是个范围,如果感觉不好,换一个就行了...
---------------------------------------------------------------------------------------------------------
3、
     测试所得,亦与经验相合,故有此一说
---------------------------------------------------------------------------------------------------------
4、
     这个程序是先有 jscript 版,再有 jscript8.0 版,之所以用 .net 编译是因为下载了 jscript8.0.chm,其中有提到 js 可以用 .net2.0 编译,尝尝鲜,况且现在把源代码小改成二用的了,不需要 .net 也可运行,如果再改一下,可能还可以跨平台。如果不是嫌 .net 目前还不如 jscript 通用,何必费这个事呢?
     但个人还是比较喜欢当前依赖度低一些的语言,毕竟通用性摆在那里,即使不为别人考虑,我自己常用的工作环境也不是很统一,所以无论是选择软件还是语言,有得选的话都比较偏向更通用的那种
     本人从未说过 .net 性能与 gawk、sed 等相较如何,不是同类没有可比性,但同水平下,依赖 .net 的 powershell 运行效率和资源占用确实比 c语言写出来 gnu 工具差一些,所以 powershell(以下简称 ps)虽确实有过人之处,但处理文本时我还是首选 sed/gawk/perl,需要面对对象或其他特殊情况时再到 jscript/vbscript/ps 中选择。ps 我也用,但事实上作为普通用户,并不需要经常修改系统设置,所以移动复制改名文件、文件夹常会用 ps,偶尔查询系统信息可以用 ps,其他时候真心用不上,并非它做不到,而是因为我知道有其他工具更合适罢了。个人最经常用的是工作中需要的自动化操作和最普遍的文本处理,前者首选 ahk,后者还是优先选择 batch/shell 系列,至于手机上,那就是 shell/lua 鸟。所以不是说 ps 不好,只是确实不太用得着...客观来说,我所掌握的脚本,每个都不怎么“用得着”,只是按自己的理解把好钢用在刀刃上,工具生来为人服务,人不必向工具效忠

TOP

回复 3# CrLf


    搞技术的,你要说自己用百度,都不好意思跟别人打招呼,google必须的

TOP

回复 4# DAIC


    那是外事不决问谷歌~话说还有一句房事不决问天涯,这tm是什么引擎...

TOP

建议坛主鉴定此为废帖,转入垃圾站,理由如下:
1 没说何谓相似。
1.1 示例代码中,没有程序输出的结果,无法从示例中看出哪些被筛选成相似,哪些不相似。
1.2 在我明确告知的情况下,还不改正。让我看源码,看其他帖子,这是在说不过去。---例如:我新买台【手机】,不知咋用,看看说明书,说明书上写着【请参见xx相机】或者【请把手机拆散研究下零件就懂了】
1.3 他根本不知道怎样发帖,还说出一大套。玄之又玄的东西。---monday 和 星期一 是否相似?碳60 与 60个碳原子是否相似?----浪费论坛资源,浪费大家时间不说,让我感觉疯了!

2 这是一个程序,而不是一个例子,一个介绍,程序必然有性能。但 【作为脚本运行时效率会比 exe 低很多】
根本拿不出,证据支持。

最终,我说,一个帖子是一个完整的东西,就好像一个人一个头一样。纵然,两个人头中的内容有重复,浪费了些许空间,那也是难免的。不可能【我没有头,想看我长啥样,还要从别人头上看到。】

你写贴要么没【头】,要么【尾巴】想强制接到别的帖子上去,我觉得这或多或少扰乱了论坛。
唉~,熊孩子,你就不能好好写贴跟帖么?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 6# PowerShell


    你的逻辑,我实在搞不懂,不想解释什么,如果兄台在网内网外都是这副德性,想必过得不咋地吧?

TOP

请问,js中的
  1. @if (@_jscript_version<6)
  2. var i
  3. @else
  4. var i:int
  5. @end
复制代码
这些@符号是干什么的呀。

TOP

回复 8# 回家路上


    条件编译语句

TOP

回复 9# CrLf


请问,想学这个JScript的话你有没有好的文档啊。我看你的JScript学的特好。O(∩_∩)O!

TOP

回复 10# 回家路上


    w3school 有入门教程,基础语法是一样的
    入门后,查查脚本技术手册就熟了

TOP

回复 11# CrLf


我这有一个问题,可以的话抽空解决一下,谢谢。O(∩_∩)O!
http://www.bathome.net/viewthread.php?tid=37044&extra=

TOP

本帖最后由 回家路上 于 2015-8-26 12:29 编辑

回复 11# CrLf


昨天学到了正则表达式。然后回头又去理解了你的mshta宿主方式混编的解析参数的正则(O(∩_∩)O~以前根本看不懂)
  1. var argv = getopts(mshta.commandLine)
  2. for(var i=0;i<argv.length;i++)alert(argv[i])
  3. function getopts(strArg){
  4.         var re = /([^"\s,;=]*"[^"]*(?:"[^"\s,;=]*")*[^"]*(?:"[^"\s,;=]*|$))|[^"\s,;=]+/g
  5.         var argv = []
  6.         strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)})
  7.         return argv
  8. }
复制代码
然后我也试写了一个正则表达式
  1. (".+?"(?=[\s,;=]|$))|[^\s,;=]+
复制代码
用你的那个方法测了测。好使哈。分享一下。
  1. <!-- :
  2. @echo off
  3. mshta "%~0" 11111   111111,1111111;   1111"1"1"11=1111"11"111 "1111111111" "11"1"1"1111"" "1111,1111"
  4. pause
  5. -->
  6. <HTA:APPLICATION id=mshta></HTA>
  7. <script>
  8. var argv = getopts(mshta.commandLine);
  9. alert(argv.join("\r\n"));
  10. close();
  11. function getopts(strArg){
  12.         var re = /(".+?"(?=[\s,;=]|$))|[^\s,;=]+/g;
  13.         var argv = [];
  14.         strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)});
  15.         return argv;
  16. }
  17. </script>
复制代码

TOP

本帖最后由 CrLf 于 2015-8-26 16:30 编辑

回复 13# 回家路上


    你好像没考虑到 getopts('断" "断"续"续') 的情况...不过突然发现我的正则也有点不对
(例子有误,已修改)

TOP

回复 14# CrLf


getopts('"断" 断"续"续') 这样的是应该返回【断】【断】【续】【续】四个字符串吗?
我以为这种的是要返回【断】【断"续"续】这两个字符串呢。(⊙﹏⊙)b

TOP

返回列表