0

次のような入力を解析しようとしています。

i171_chr1_C_MSTA_K0.184_full    i266_chr1_+_MSTA_K0.195_full    92.06   2255    125 21  1   2221    2235    1   0.0 3123
i172_chr1_+_MLT1D_K0.575_full   i172_chr1_+_MLT1D_K0.575_full   100.00  2290    0   0   1   2290    1   2290    0.0 4229
i172_chr1_+_MLT1D_K0.575_full   i172_chr1_+_MLT1D_K0.575_full   100.00  2290    0   0   1   2290    1   2290    0.0 4229

望ましい出力は次のとおりです。

i171 1 i266 1 92
i172 1 i172 1 100
i172 1 i172 1 100

つまり、最初の「_」の前の名前を最初の列に抽出し、chr の後の部分を 2 列目に抽出しています (3 列目と 4 列目も同様)。

最初の 4 列で適切に機能するコマンドを作成しました。

grep -v "#" blastGE90_lengthGE1000 | cut -f 1,2 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+).+/\1 \2 \3 \4/'

ただし、入力の 3 番目の列を一致させようとすると、成功しません。必要なものではなく、常に最後の一致に一致します。

grep -v "#" blastGE90_lengthGE1000 | cut -f 1,2 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+).+([0-9]+\.).+/\1 \2 \3 \4 \5/' 

したがって、正規表現を使用して非空白またはタブレータに一致させたいのですが、わかりません。

4

2 に答える 2

3

私はあなたのコマンドを修正しました:

grep -v "#" blastGE90_lengthGE1000 | cut -f 1-3 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+)_.+\t([0-9]+).+/\1 \2 \3 \4 \5/'

最初の3列が必要なため、使用する必要はありcut -f 1-3ません。cut -f 1,2式の最後のキャプチャグループも修正しましたsed

于 2013-03-20T12:21:55.593 に答える
1

ここで使用awkします:

$ awk -F'_| +' '{gsub(/chr/,"");print $1,$2,$7,$8,int($13)}' file
i171 1 i266 1 92
i172 1 i172 1 100
i172 1 i172 1 100
于 2013-03-20T12:04:06.377 に答える