1

我的源文件是制表符分隔的,我需要对第 4 列值进行 grep。我怎样才能在 Groovy 中做到这一点?这是我的代码不起作用。它甚至接近吗?

 def tab_file = new File('source_file.tab')
 tab_file.eachline { line -> println line.grep('\t\t\t\t'} 
4

2 回答 2

3

您可以按制表符拆分,这将为您提供一个可以索引的数组以获取该列:

groovy:000> s = "aaa\tbbb\tccc\tddd\teee";
===> aaa        bbb     ccc     ddd     eee
groovy:000> s.split("\\t")[3]
===> ddd
于 2012-11-27T17:43:01.427 回答
2

像下面这样的东西应该可以工作:

tab_file.eachLine { line -> 
    println ((line =~ /([^\t]*\t){3}([^\t]*)/)[0][2])
} 

说明: 操作员使用右侧的模式=~创建一个对象。Groovy 允许您通过数组下标运算符java.util.regex.Matcher隐式执行。find()如果您的正则表达式中有组,则List每个结果都会产生一个。该列表将整个匹配区域作为元素 0,然后将组作为其他元素。[0][2]正则表达式的第一个匹配(零索引)也是如此,特别是第二组匹配。(顺便说一句,如果正则表达式中没有组,则结果只是一个匹配的字符串)。详细信息/示例在这里

更新/旁白: 我只是在研究添加到Objectgrep()的fxnality ,因为我很好奇。我不确定我是否看到了集合类型之外的实用程序,但是当应用于字符串时,它不会像您预期的那样 - 它似乎循环遍历字符串中的字符,并将每个字符与传入的字符进行比较字符串(收集列表中的匹配项)。如果您传入的字符串大于 1 个字符,则您将永远无法匹配,因为每次迭代检查的字符永远不会等于传入的整个字符串(在您的示例中, any )\t != "\t\t\t\t"

于 2012-11-27T17:56:17.120 回答