Как я могу получить grep n столбца файла с разделителями табуляции в Groovy?

Мой исходный файл с разделителями табуляции и мне нужно grep 4-й столбец значений. Как я могу сделать это в Groovy? Вот мой код, который не работает. Это даже близко?

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

2 ответа

Решение

Вы можете разделить символ табуляции, что даст вам массив, который вы можете проиндексировать, чтобы получить столбец:

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() через оператор индекса массива. Если в вашем регулярном выражении есть группы, это приводит к List за каждый результат. Этот список имеет всю совпавшую область как элемент 0, затем группы как дополнительные элементы. Так [0][2] это первое совпадение регулярного выражения (с нулевым индексом), в частности совпадение 2-й группы. (Между прочим, если в регулярном выражении не было групп, результатом будет просто строка с соответствием). Подробности / примеры здесь.

Обновление / В сторону: я просто смотрел в grep() fxnality добавил в Object, как мне было любопытно. Я не уверен, что вижу утилиту за пределами типов коллекций, но применительно к строкам она работает не так, как вы могли бы ожидать - она, кажется, перебирает символы в строке и сравнивает каждый символ с переданным Строка (сбор матчей в списке). Если ваша переданная строка>1 символа, вы никогда не получите соответствия, так как проверяемый символ за одну итерацию никогда не будет равен всей переданной строке (в вашем примере любой \t != "\t\t\t\t")

Другие вопросы по тегам