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

[文本处理] 求批处理 提取文本中每行最末尾的中括号及其内部字符

求大神动动手指啊。
我有几百万行格式基本固定的文本如下,每行末尾一定是一个中括号及内部字符。但是行中也可能出现中括号,现在我提取每行末尾那个中括号及其内部字符,行中中括号不要。
求大神写个批处理
>  CT_875 [Chlamydia trachomatis D/UW-3/CX]
> superantigen-like protein [Staphylococcus aureus subsp. aureus str. Newman]
> tryptophanyl-tRNA [synthetase] [Salmonella enterica subsp. enterica serovar Agona str. SL483]
> AsnC [family transcriptional] regulator [Geodermatophilus obscurus DSM 43160]
> methionyl-tRNA formyltransferase [[Clostridium] saccharolyticum WM1]

如果你确定行尾方括号内部没有嵌套方括号的话,可以试试这样:
  1. sed "s/.*\(\[[^][]\+\]\)$/\1/" a.txt > b.txt
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# anjohnlee
一楼数据最后行 最后结果是什么 “methionyl-tRNA formyltransferase [[Clostridium] saccharolyticum WM1]”
是希望得到  “[Clostridium] saccharolyticum WM1”    还是希望最后结果  ‘saccharolyticum WM1“

TOP

回复 3# terse


    楼主说最后一行是他弄错了。800万行,2楼代码耗时30分钟左右(他当时没有精确计时)。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

来个GAWK
  1. gawk -F[ "{print FS$NF}" a.txt >b.txt
复制代码

TOP

本帖最后由 CrLf 于 2014-10-15 23:20 编辑

实测用 grep 更快些,大概是支持双向预查的正则要比替换来得快捷:
  1. grep -o -P "(?<=\[)[^\[\]]+?(?=][^\[\]]*$)" a.txt>b.txt
复制代码
测试 400 万行文本 31 秒,2 楼的 sed 方案是 77 秒,不知道楼主的测试背景是什么,为什么竟然要半个小时...
发现理解错了,楼主是要求保留括号的,那就是这样:
  1. grep -o -P "\[[^\[\]]+\]$" a.txt>b.txt
复制代码
或者这样:
  1. grep -o -e "\[[^]\[]\{1,\}\]$" a.txt>b.txt
复制代码

TOP

来一个可以兼容一对嵌套方括号的
  1. sed "s/.*\(\[[^][]*\[\+[^][]*\]\+[^][]*\]\)$/\1/" a.txt | sed "s/.*\(\[[^][]\+\]\)$/\1/"
复制代码
写的比较挫,有时间再想想如何优化。

TOP

本帖最后由 CrLf 于 2014-10-15 23:43 编辑

用 powershell 来一个 .net 特色的正则,平衡组匹配最大的闭合 []:
  1. type a.txt | %{
  2.    if($_ -match '\[((?<test>\[)|(?<-test>\])|[^\[\]])*(?(test)(?!))\]$') {
  3.       $matches[0]
  4.    }
  5. }
复制代码

TOP

来瞻仰下诸位大神。。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 terse 于 2014-10-16 19:39 编辑

这里效率上还是SED略逊 grep 确实高
gwaK 直接分隔符 不处理嵌套 无嵌套的话和 grep 有一比
  
grep
  1. grep -o -P "\[([^\[\]]|(?R))*\]" a.txt
复制代码
SED
  1. sed -r "s/.*(\[([^][]+|\[[^][]+\])+\])$/\1/" a.txt
复制代码
1

评分人数

    • CrLf: 递归匹配技术 + 1

TOP

回复 10# terse


    原来 perl 正则还有 (?R) 的用法,我特么一直以为平衡组是 .net 独有的,才知道 perl 也支持,不过是叫递归组

TOP

返回列表