Как я могу получить 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"
)