列から文字列の一部を抽出し、他の列を保持します。

列から文字列の一部を抽出し、他の列を保持します。

次のような多くの行を含むタブ区切りのファイルがあります。

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

おすすめ記事