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
答え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で書かれた答えです。一行ずつ進んでください。
BEGIN
ヘッダー行の説明(本文行のようにput
ヘッダー行がタブ\t
で区切られている場合は省略可能)本文行(行)を分割して配列
\t
として保存できます。 4つの連続した空白文字、さらには(4つの連続した空白文字)に@a
分割することは可能ですが、危険です。\s**4
\h**4
水平空白文字) 3番目の列にパターンが含まれていない場合。しかし、また危険があります。3番目の列(たとえば)は、正規表現に一致する1つ以上のために編集された(つまり、肯定的に選択された)列テキスト
@a[2]
に置き換えられます。考えは逆です(破壊的です)。次に、選択した-IDをコンマで連結します。@a[2]
comb
GO\: \d+
comb
split
GO
最後に、
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
答え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