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

如何在Groovy中grep制表符分隔文件的第n列?,groovy,grep,tab-delimited,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'} 您可以按制表符拆分,这将为您提供一个数组,您可以索引到该数组中以获取列: groovy:000> s = "aaa\tbbb\tccc\tddd\tee

我的源文件是以制表符分隔的,我需要grep第4列的值。如何在Groovy中实现这一点?这是我的代码,它不起作用。离这里很近吗

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

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

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

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

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

类似于以下的方法应该可以工作:

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

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

类似于以下内容的操作应该可以工作:

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

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

Brian,当我尝试你的代码时,我得到了一个MissingMethodException:没有方法java.io.file.eachline的签名消息…抱歉,我从原始帖子中复制了它。现在已修复。已将[0][2]上的信息添加到answerBrian的正文中。当我尝试您的代码时,我收到一个MissingMethodException:没有方法java.io.file.eachline消息的签名…抱歉,我从原始帖子中复制了它。现已修复。已将[0][2]上的信息添加到答案正文中。请不要忘记多次分配定义名称、年龄、城市=john\t18\t纽约。拆分\t;:-不要忘记多重分配定义名称、年龄、城市=john\t18\t纽约.split\t;:-