如何在Groovy中grep第13列制表符分隔文件?

时间:2012-11-27 17:23:41

标签: groovy grep tab-delimited

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

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

2 个答案:

答案 0 :(得分:3)

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

groovy:000> s = "aaa\tbbb\tccc\tddd\teee";
===> aaa        bbb     ccc     ddd     eee
groovy:000> s.split("\\t")[3]
===> ddd

答案 1 :(得分:1)

以下内容应该有效:

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

<强>说明: =~运算符使用右侧的模式创建java.util.regex.Matcher对象。然后,Groovy允许您通过数组下标运算符隐式执行find()。如果您的正则表达式中包含组,则会为每个结果生成List。此列表将整个匹配区域作为元素0,然后将组作为其他元素。所以[0][2]是正则表达式(零索引)的第一个匹配,特别是第二组匹配。 (顺便说一句,如果正则表达式中没有组,则结果只是匹配的字符串)。详情/例子here

<强>更新/除 我只是在调查添加到Objectgrep() fxnality,因为我很好奇。我不确定我是否在集合类型之外看到了该实用程序,但是当应用于字符串时,它并没有像您期望的那样 - 它似乎遍历字符串中的字符,并将每个字符与传入的字符进行比较字符串(在列表中收集匹配项)。如果传入的字符串是> 1个字符,那么你永远不会得到匹配,因为每次迭代检查的字符永远不会等于传入的整个字符串(在你的例子中,任何\t != "\t\t\t\t"