8番目と9番目のフィールド/列を生成し、適切な文字を4列と5列の数字にエンコードしたいと思います。コロンで区切られた6つの数字は次のとおりです。A:T:C:G:N:del
注:列6と7の一部の行が空でした。 NAを挿入してこの問題を解決しました。
awk -F'[[:space:]]' '$5 && !$6{ $6="NA" }1'
awk -F'[[:space:]]' '$6 && !$7{ $7="NA" }1'
次に、もう一度タブを使用してファイルを区切ります。sed -e 's/ /\t/g'
ファイル.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant
出力 example.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
どんな助けでも大変感謝します! !
答え1
$ cat tst.awk
BEGIN {
FS=OFS="\t"
split("A:T:C:G:N:del",map,/:/)
}
{ print $0, vals2id($4), vals2id($5) }
function vals2id(vals, arr, i, id) {
split(vals,arr,/:/)
for (i in arr) {
if (arr[i] != 0) {
id = map[i]
}
}
return id
}
$ awk -f tst.awk file
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
答え2
私は次のsedスクリプトがあなたがしたいことをすると信じています:
s/\t[1-9][0-9]*:0:0:0:0:[^\t]*\t/&A\t/g
s/\t0:[1-9][0-9]*:0:0:0:[^\t]*\t/&T\t/g
s/\t0:0:[1-9][0-9]*:0:0:[^\t]*\t/&C\t/g
s/\t0:0:0:[1-9][0-9]*:0:[^\t]*\t/&G\t/g
s/\t0:0:0:0:[1-9][0-9]*:[^\t]*\t/&N\t/g
s/\t0:0:0:0:0:[1-9][0-9]*\t/&del\t/g
s/^\t(([^\t]*\t){4})([^\t]*)\t([^\t]*)(\t[^\t]*)(\t.*)/\1\4\6\t\3\5/
走る:
sed -rf script.sed file.tsv > output.tsv
答え3
Perlとsedユーティリティを使用して、次のことができます。
perl -F'\t' -pale '$"="\t";
/(?:^|:)(?=[1-9])/g, push(@F, qw[A T C G N del][+pos>>1]) for @F[3,4];
$_="@F";
' file.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532398.1 302035 C 0:0:0:0:0:2 42:0:0:0:0:0 KCND2 intergenic_region del A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
sed -re '
1{x;s/.*/A:T:C:G:N:del/;x;}
s/\t/&\n/3;G;ba
:b;s/\t/&\n/4;G
:a;s/\n0:(.*)\n[^:]+:/0:\n\1\n/;ta
s/\n//;s/\n([^:]+)/\t\1\n/;s/\n.*//;s/^//;tc
:c;s/\t/&/8;t;bb
' file.tsv
説明する:
現在のレコードの
$F[3]
4番目と5番目のフィールド(別名行)から$F[4]
$_
(フィールド内)0以外の最初の数字の位置を決定します。事実に依存
2つの位置を占めて、見つかった位置を半分に減らして、フィールドの匿名配列インデックスを
0:
取得します。qw[A T C G N del]
これで、見つかったA / T / C / G / Nまたはdelを配列に追加するだけです
@F
。@F
次に、(タブ)を使用して配列を推論し$"
てから印刷します。
仮定:
- 先行TABがない場合は、配列内のフィールド数が削除されます
@F
。 - 4番目と5番目のフィールドが想定されます
one-hot
。これは常にゼロ以外の数字が確実に存在することを意味します。 - 4番目と5番目のフィールドには、ゼロで始まるゼロ以外の数字はありません。
- 4 番目と 5 番目のフィールドには、00 の両方が 0 として表示されません。
- 4番目と5番目のフィールドには、単一のコロンで区切られた正確に6つの数字があり、末尾/先行コロンはありません。