我的源文件是制表符分隔的,我需要grep第4列值。我怎么能在Groovy中这样做?这是我的代码不起作用。它甚至接近了吗?
def tab_file = new File('source_file.tab')
tab_file.eachline { line -> println line.grep('\t\t\t\t'}
答案 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。
<强>更新/除强>
我只是在调查添加到Object的grep()
fxnality,因为我很好奇。我不确定我是否在集合类型之外看到了该实用程序,但是当应用于字符串时,它并没有像您期望的那样 - 它似乎遍历字符串中的字符,并将每个字符与传入的字符进行比较字符串(在列表中收集匹配项)。如果传入的字符串是> 1个字符,那么你永远不会得到匹配,因为每次迭代检查的字符永远不会等于传入的整个字符串(在你的例子中,任何\t != "\t\t\t\t"
)