次のような多くの行を含むタブ区切りのファイルがあります。
1 ILM-rs199 info1 info2 info3
2 aws-rs2778 info4 info5 info6
3 345-678945 info7 info8 info9
4 aws-rs789 info10 info11 info-rs789
2番目と4番目の列を抽出したいです。 2番目の列では、次のようにrsで始まる文字列とそれに続く数字だけが必要です。
rs199 info2
rs2778 info5
rs789 info11
以下を使用して2番目の列のみを抽出できました。
egrep -o 'rs[0-9]*' filename
与えられた
rs199
rs2778
rs789
しかし、他の熱も維持する必要があるときに詰まった。
awkでegrepを使用しようとしています(2番目の列のrs番号を抽出するために)完了できません。
ベストアンサー1
$ # assuming `rs[digits]` string will match only in 2nd column
$ # string matched within () will get printed
$ perl -lne 'print /(rs\d+\t)[^\t]+\t([^\t]+)/' ip.txt
rs199 info2
rs2778 info5
$ # to match from 2nd column only
$ perl -lne 'print /^[^\t]+\t[^\t]*(rs\d+\t)[^\t]+\t([^\t]+)/' ip.txt
rs199 info2
rs2778 info5
$ # to get some other column, say 2nd and 5th
$ perl -lne 'print /^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){2}([^\t]+)/' ip.txt
rs199 info3
rs2778 info6
一致するものがある場合にのみ印刷します。
$ perl -lne '/^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){1}([^\t]+)/ && print $1,$2' ip.txt
rs199 info2
rs2778 info5
$ perl -lne '/^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){2}([^\t]+)/ && print $1,$2' ip.txt
rs199 info3
rs2778 info6
抽出する文字列が互いに隣接している以前のソリューション
$ # assuming the shell being used supports $'' strings
$ grep -o $'rs[0-9]*\t[^\t]*' ip.txt
rs199 info1
rs2778 info4