找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 58208|回复: 19

LookLike 过滤/获取相似内容

[复制链接]
发表于 2014-4-28 05:56:10 | 显示全部楼层 |阅读模式
实际上是 jscript.net,用 jsc.exe 编译的,需要 .net 2.0 支持
链接: https://pan.baidu.com/s/128f__u0EPAMNbZ_nSULrWQ?pwd=sqc6

源代码在此,可以直接以 jscript 脚本运行:
链接: https://pan.baidu.com/s/1b25UR16KU9QncuxoFwF-6g?pwd=q7jc

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. ::自行发挥。。。。。。
复制代码
发表于 2014-6-20 11:58:12 | 显示全部楼层
1  感谢分享
2 你这个帖子有个重大bug,没有名词解释,何谓相似,何谓不相似。“abbbc” 和“abbc”相似么?论坛论坛,你得先说出论点,然后才说如何编程实现。你木有主题,谁知道相似是干嘛使得呢?这是你的缺点,我既然指出了,你就不要不承认。

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

4 潜在的,我还有个疑惑,我心底认为你,【1 你认为。net太占内存。2你认为。net性能不如awk,sed】而今你竟然开始编写。net程序,古怪,古怪。
 楼主| 发表于 2014-6-20 16:28:32 | 显示全部楼层
本帖最后由 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 不好,只是确实不太用得着...客观来说,我所掌握的脚本,每个都不怎么“用得着”,只是按自己的理解把好钢用在刀刃上,工具生来为人服务,人不必向工具效忠
发表于 2014-6-20 17:32:12 | 显示全部楼层
回复 3# CrLf


    搞技术的,你要说自己用百度,都不好意思跟别人打招呼,google必须的
 楼主| 发表于 2014-6-20 17:38:48 | 显示全部楼层
回复 4# DAIC


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

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

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

你写贴要么没【头】,要么【尾巴】想强制接到别的帖子上去,我觉得这或多或少扰乱了论坛。
唉~,熊孩子,你就不能好好写贴跟帖么?
 楼主| 发表于 2014-6-20 18:47:10 | 显示全部楼层
回复 6# PowerShell


    你的逻辑,我实在搞不懂,不想解释什么,如果兄台在网内网外都是这副德性,想必过得不咋地吧?
发表于 2015-8-15 13:07:32 | 显示全部楼层
请问,js中的

  1. @if (@_jscript_version<6)
  2.         var i
  3. @else
  4.         var i:int
  5. @end
复制代码
这些@符号是干什么的呀。
 楼主| 发表于 2015-8-15 14:50:34 | 显示全部楼层
回复 8# 回家路上


    条件编译语句
发表于 2015-8-17 10:03:18 | 显示全部楼层
回复 9# CrLf


请问,想学这个JScript的话你有没有好的文档啊。我看你的JScript学的特好。O(∩_∩)O!
 楼主| 发表于 2015-8-17 14:59:34 | 显示全部楼层
回复 10# 回家路上


    w3school 有入门教程,基础语法是一样的
    入门后,查查脚本技术手册就熟了
发表于 2015-8-24 12:50:03 | 显示全部楼层
回复 11# CrLf


我这有一个问题,可以的话抽空解决一下,谢谢。O(∩_∩)O!
http://www.bathome.net/viewthread.php?tid=37044&extra=
发表于 2015-8-26 11:30:44 | 显示全部楼层
本帖最后由 回家路上 于 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>
复制代码
 楼主| 发表于 2015-8-26 13:50:57 | 显示全部楼层
本帖最后由 CrLf 于 2015-8-26 16:30 编辑

回复 13# 回家路上


    你好像没考虑到 getopts('断" "断"续"续') 的情况...不过突然发现我的正则也有点不对
(例子有误,已修改)
发表于 2015-8-26 14:31:43 | 显示全部楼层
回复 14# CrLf


getopts('"断" 断"续"续') 这样的是应该返回【断】【断】【续】【续】四个字符串吗?
我以为这种的是要返回【断】【断"续"续】这两个字符串呢。(⊙﹏⊙)b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:42 , Processed in 0.022136 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表