ソース ファイルはタブ区切りで、4 列目の値を grep する必要があります。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
次のようなものが機能するはずです。
tab_file.eachLine { line ->
println ((line =~ /([^\t]*\t){3}([^\t]*)/)[0][2])
}
説明:=~
オペレーターはjava.util.regex.Matcher
右側のパターンを使用してオブジェクトを
作成します。find()
Groovy では、配列添字演算子を介して暗黙的に実行できます。正規表現にグループが含まれている場合、結果はList
for each になります。このリストには、一致した領域全体が要素 0 として含まれ、グループがさらに要素として含まれます。正規[0][2]
表現 (ゼロ インデックス) の最初の一致、特に 2 番目のグループの一致も同様です。(ところで、正規表現にグループがなかった場合、結果は一致する単なる文字列になります)。詳細/例はこちら.
更新/脇:興味があったので、 Objectに追加さ
れたgrep()
fxnalityを調べていました。コレクション型の外でこのユーティリティが表示されるかどうかはわかりませんが、文字列に適用すると、期待どおりに動作しません。文字列内の文字をループして、各文字を渡された文字と比較するように見えます。文字列 (リスト内の一致を収集)。渡された文字列が1文字を超える場合、反復ごとに検査中の文字が渡された文字列全体と等しくなることはないため、一致することはありません(例では、 any )\t != "\t\t\t\t"