3番目の列のすべての項目を削除し、特定のテキストのみを保持します。

3番目の列のすべての項目を削除し、特定のテキストのみを保持します。

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:xxxxxxx3番目の列では、各用語をカンマで区切る必要がある部分を除くすべてのテキストを削除したいと思います。たとえば、

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は、各入力行を与えられた文字の配列に分割する-andperlと同様に機能します。ここではタブを渡します。まだファイルを保存していない場合は、いつでもタブ区切りのファイルとして保存できます。次に、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    

答え2

AWK:

$ awk '
     BEGIN{FS=OFS="\t"}
     {
  while(match($3,/GO:[0-9]+/)) 
     {
  col= sprintf("%s",((col) ? col ",": "")substr($3,RSTART,RLENGTH));  
  $3= substr($3,RSTART+RLENGTH)
     }
     }
  col{ $3=col; col=""}
  1'

答え3

使用幸せ(以前のPerl_6)

\tタブを列区切り文字として想定します。

~$ raku -ne 'BEGIN put get;   \
             my @a = .split(:skip-empty, / \t /, 3);   \
             @a[2] = (@a[2] // "").comb(/ GO\: \d+ /).join(",");   \
             @a.join("\t").trim-trailing.put;'   file

これはPerlプログラミング言語の1つであるRakuで書かれた答えです。一行ずつ進んでください。

  1. BEGINヘッダー行の説明(本文行のようにputヘッダー行がタブ\tで区切られている場合は省略可能)

  2. 本文行(行)を分割して配列\tとして保存できます。 4つの連続した空白文字、さらには(4つの連続した空白文字)に@a分割することは可能ですが、危険です。\s**4\h**4水平空白文字) 3番目の列にパターンが含まれていない場合。しかし、また危険があります。

  3. 3番目の列(たとえば)は、正規表現に一致する1つ以上のために編集された(つまり、肯定的に選択された)列テキスト@a[2]に置き換えられます。考えは逆です(破壊的です)。次に、選択した-IDをコンマで連結します。@a[2]combGO\: \d+combsplitGO

  4. 最後に、splitタブjoinでは列が再グループ化されて\t出力されますput

入力例:

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

出力例:

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
MA_10001g0010   MA_10001g0010
MA_10002030g0010    MA_10002030g0010    GO:0005737,GO:0000184,GO:0004386,GO:0008270,GO:0003677,GO:0005524
MA_10002157g0010    MA_10002157g0010    GO:0006468,GO:0005524,GO:0004672
MA_10002549g0010    MA_10002549g0010
MA_10002583g0010    MA_10002583g0010    GO:0008168
MA_10002614g0010    MA_10002614g0010
MA_10002643g0010    MA_10002643g0010    GO:0055114

https://docs.raku.org
https://raku.org

答え4

あなたは使用を検討することができますミラー、TSVファイルのサポートが組み込まれています。

  • $go_descriptionフィールドを;配列に分割
  • GO:nnnnnn正規表現を適用して、配列の各要素から部分文字列を抽出します。
  • 結果を,単一の文字列に戻す
  • 結果を再割り当て$go_description

だから

mlr --tsv put '
  $go_description = joinv(
    apply(splitax($go_description,";"),func(e) {return regextract(e,"GO:[[:digit:]]+")}),
    ","
  )
' gene_table_Go.tsv

関連情報