私のデータに関連する次の問題を解決するためにbashコードを使用するつもりです。
hapmap形式の次のデータセットを考慮すると、「対立遺伝子」列のデータに基づいて一部の文字(この場合は文字)を置き換える必要があります。対立遺伝子列のデータは、4つの文字ペア(A、G、C、およびT)の組み合わせです。
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G T T G K T
mar_2 T/G 1 2386848 T G T K T K
mar_3 G/T 1 2387553 T K G K T G
mar_4 G/A 1 2564608 G G G N R A
mar_5 C/T 1 2564616 C Y C Y T N
.
.
私が得たいのは、行全体を通過するコードです(行1の場合)。文字「T」(「/」の後の文字)が見つかった場合は、文字「G」(文字の前の文字)が文字「R」、「Y」、「S」、「W」、「K」、または「M」を見つけた場合「T」(「/」の後の文字)に置き換えます。 。
つまり、コードは(各行で)「/」の後の文字(「対立遺伝子」列で)に一致するすべての文字を見つけ、「/」の前の文字と一致する文字に置き換える必要があります。そして、「R」、「Y」、「S」、「W」、「K」、または「M」)のいずれかに一致する文字を見つけると、それを一致する文字に置き換える必要があります。 "/"次のもの。
私が得たい結果は次のとおりです。
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G G G G T G
mar_2 T/G 1 2386848 T T T G T G
mar_3 G/T 1 2387553 G T G T G G
mar_4 G/A 1 2564608 G G G N A G
mar_5 C/T 1 2564616 C T C T C N
.
.
注:「N」は欠落している値を示すため、そのままにしてください。
この問題に関連する支援をいただきありがとうございます。
ベストアンサー1
そしてperl
$ perl -F'\s+|/' -lape '
s/^(\S+\s+){4}\K.*/$&=~s|$F[2]|$F[1]|gr/e;
s/^(\S+\s+){4}\K.*/$&=~s|[RYSWKM]|$F[2]|gr/e
' ip.txt
rs# alleles chro pos ind1 ind2 ind3 ind4 ind5 ind6. .
mar_1 G/T 1 2386806 G G G G T G
mar_2 T/G 1 2386848 T T T G T G
mar_3 G/T 1 2387553 G T G T G G
mar_4 G/A 1 2564608 G G G N A G
mar_5 C/T 1 2564616 C T C T C N
-F'\s+|/'
/
入力行をスペースまたは文字に分割して@F
配列に保存^(\S+\s+){4}\K.*
最初の4つを除くすべての列を取得します。$&=~s|$F[2]|$F[1]
一致する部分に対して別の交換を実行します(最初の4列を除く)。$F[2]
後ろの文字を含み/
、$F[1]
前の文字を含めます。/
- 修飾子は
r
置換された最終文字列を返し、修飾子e
は代替部分でPerlコードの使用を許可します。 - 同じパターンが再利用されるため、2番目の交換も次のように短縮できます。
s//$&=~s|[RYSWKM]|$F[2]|gr/e
- バラよりコマンドスイッチ
-lape
オプションの説明