次の行を含むファイルがあります。
TsM_000477300_transcript_id_TsM_000477300_gene_id_TsM_000477300,extr 29
TsM_000541200_transcript_id_TsM_000541200_gene_id_TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400_transcript_id_TsM_000020400_gene_id_TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600_transcript_id_TsM_000268600_gene_id_TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800_transcript_id_TsM_000533800_gene_id_TsM_000533800,extr 31
TsM_000208300_transcript_id_TsM_000208300_gene_id_TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500_transcript_id_TsM_000379500_gene_id_TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200_transcript_id_TsM_000882200_gene_id_TsM_000882200,extr 32
TsM_001173700_transcript_id_TsM_001173700_gene_id_TsM_001173700,extr 31
私が望む出力は次のとおりです。
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
使いましたが、 sed -E 's/(^.+)_transcript_id_.+.,(.*$)/\1,\2/'
欲しいものを手に入れることはできません。これは私の結果です。
TsM_000477300,extr 29
TsM_000541200,E.R._golg 3
TsM_000020400,cyto_pero 1
TsM_000268600,golg 2
TsM_000533800,extr 31
TsM_000208300,E.R. 2
TsM_000379500,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
私はいくつかのバリエーションを試しましたが、うまくいかず、理由がわかりません。
答え1
問題は、.+.,
以下を含むすべてを貪欲に一致させることです。最後 ,
これを修正したり、CSVコンテキストで貪欲でないことをエミュレートでき[^,]+.,
ます[^,]+,
。ただし、次のように簡単な操作を実行することもできます。
$ sed 's/_transcript_id_[^,]*//' file
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
答え2
すでに説明したように、問題は正規表現が可能な限り長い一致を見つけることです。別の解決策は、貪欲ではない正規表現を可能にするツールを使用することです。
$ perl -pe 's/(TsM_.+?)_.+?,/$1,/' file
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
または、元の試みを少し変更したバージョンを使用してください。
$ perl -pe 's/(^.+)_transcript_id_.+?,(.*$)/\1,\2/' file
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
もちろん、データ内の成績表IDが最後に繰り返されるように見えるので、単に次のことができます。
$ cut -d_ -f9- file
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31
または:
$ sed 's/.*TsM/TsM/' file
TsM_000477300,extr 29
TsM_000541200,extr 9,plas 7,mito 6.5,cyto_mito 4,E.R. 3,lyso 3,golg 3,E.R._golg 3
TsM_000020400,extr 28,cyto 1,E.R. 1,pero 1,lyso 1,cyto_pero 1
TsM_000268600,extr 13,plas 7,E.R. 5,lyso 3,golg 2
TsM_000533800,extr 31
TsM_000208300,extr 19,pero 5,lyso 4,plas 2,E.R. 2
TsM_000379500,extr 15,golg 12,lyso 3
TsM_000882200,extr 32
TsM_001173700,extr 31