3つの列を持つデータセットがあります。
https://drive.google.com/file/d/1gtCssfAXHxRjGfX8uTAaimGPWCA2cnci/view?usp=sharing
最初の数行は次のとおりです。
ID transcript_id go_description
MA_10000213g0010 MA_10000213g0010
MA_10000405g0010 MA_10000405g0010 GO:0006468-protein phosphorylation;GO:0030246-carbohydrate binding;GO:0005524-ATP binding;GO:0004672-protein kinase activity
MA_1000049g0010 MA_1000049g0010
MA_10000516g0010 MA_10000516g0010 GO:0005515-protein binding
MA_10001015g0010 MA_10001015g0010
MA_10001337g0010 MA_10001337g0010
MA_10001425g0010 MA_10001425g0010
MA_10001478g0010 MA_10001478g0010
MA_10001558g0010 MA_10001558g0010
MA_10001g0010 MA_10001g0010
MA_10002030g0010 MA_10002030g0010 GO:0005737-cytoplasm;GO:0000184-nuclear-transcribed mRNA catabolic process, nonsense-mediated decay;GO:0004386-helicase activity;GO:0008270-zinc ion binding;GO:0003677-DNA binding;GO:0005524-ATP binding
MA_10002157g0010 MA_10002157g0010 GO:0006468-protein phosphorylation;GO:0005524-ATP binding;GO:0004672-protein kinase activity
MA_10002549g0010 MA_10002549g0010
MA_10002583g0010 MA_10002583g0010 GO:0008168-methyltransferase activity
MA_10002614g0010 MA_10002614g0010
MA_10002643g0010 MA_10002643g0010 GO:0055114-oxidation-reduction process
GO:xxxxxxx
3番目の列では、各用語をカンマで区切る必要がある部分を除くすべてのテキストを削除したいと思います。たとえば、
GO:0006468, GO:0030246
最初の2つの列は変更されていないままにしてください。どうすればいいですか?
ベストアンサー1
データがタブで区切られていると仮定すると、次のようにできます。
perl -F'\t' -lane '
$F[2] = join(",", $F[2]=~/GO:\d+/g);
print join "\t",@F
' gene_table_Go\ -\ gene_table_Go.tsv > fixed.tsv
makeは、各入力行を与えられた文字の配列に分割する-a
ndperl
と同様に機能します。ここではタブを渡します。まだファイルを保存していない場合は、いつでもタブ区切りのファイルとして保存できます。次に、3番目のフィールドを既存の3番目のフィールドに続くすべての数字を連結した結果に設定します。つまり、GO用語だけを維持し、他のものは何も保持しません。次に、タブで接続された配列を印刷します。awk
@F
-F
$F[2]
GO:
@F
以下は、同じ基本的なアイデアをさらに圧縮したバージョンです。
perl -F'\t' -lane '
$,="\t";
print @F[0..1], join(",",$F[2]=~/GO:\d+/g);
' gene_table_Go\ -\ gene_table_Go.tsv
どちらの例も同じ出力を生成します。
$ perl -F'\t' -lane '$,="\t"; print @F[0,1], join(",",$F[2]=~/GO:\d+/g);' gene_table_Go\ -\ gene_table_Go.tsv | head
ID transcript_id
MA_10000213g0010 MA_10000213g0010
MA_10000405g0010 MA_10000405g0010 GO:0006468,GO:0030246,GO:0005524,GO:0004672
MA_1000049g0010 MA_1000049g0010
MA_10000516g0010 MA_10000516g0010 GO:0005515
MA_10001015g0010 MA_10001015g0010
MA_10001337g0010 MA_10001337g0010
MA_10001425g0010 MA_10001425g0010
MA_10001478g0010 MA_10001478g0010
MA_10001558g0010 MA_10001558g0010
GO:\d+
ヘッダーが実際にパターンと一致しないため、ヘッダーをそのまま残すには、次のようにします。
$ perl -F'\t' -lane '$,="\t"; print $. == 1 ? @F : @F[0,1], join(",",$F[2]=~/GO:\d+/g);' gene_table_Go\ -\ gene_table_Go.tsv | head
ID transcript_id go_description
MA_10000213g0010 MA_10000213g0010
MA_10000405g0010 MA_10000405g0010 GO:0006468,GO:0030246,GO:0005524,GO:0004672
MA_1000049g0010 MA_1000049g0010
MA_10000516g0010 MA_10000516g0010 GO:0005515
MA_10001015g0010 MA_10001015g0010
MA_10001337g0010 MA_10001337g0010
MA_10001425g0010 MA_10001425g0010
MA_10001478g0010 MA_10001478g0010
MA_10001558g0010 MA_10001558g0010