このように多くの行があるとしましょう。
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
予想出力:
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 83761448380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
$4列で繰り返される2行目(および3行目、4行目など)を変更する方法が必要です。 「SGIP_1」または「WhateverGeneName_1」を読み取れるように「_1」文字列を追加したいと思います。
awkまたはsedソリューションが最適です。よろしくお願いします。
答え1
希望する最も簡単な場合みんな_N
遺伝子名が一度だけ表示されても、次のことができます。
$ awk '$4=$4"_"++a[$4];' file.gff
chr1 66999638 66999638 SGIP1_1 1 +
chr1 66999251 66999251 SGIP1_2 1 +
chr1 33545778 33549778 AZIN2_1 1 +
chr1 8376144 8380144 SLC45A1_1 1 +
chr1 16765166 16769166 NECAP2_1 1 +
chr1 33544713 33548713 AZIN2_2 1 +
chr1 25069759 25073759 CLIC4_1 1 +
chr1 33544729 33548729 AZIN2_3 1 +
chr1 50487626 50491626 AGBL4_1 1 -
chr1 92349836 92353836 TGFBR3_1 1 -
これにより、フィールド区切り文字が単一のスペースに変わります。 GFFファイルと同様に、タブで区切られた状態を維持するには、次のようにします。
$ awk -vOFS="\t" '$4=$4"_"++a[$4];' file.gff
chr1 66999638 66999638 SGIP1_1 1 +
chr1 66999251 66999251 SGIP1_2 1 +
chr1 33545778 33549778 AZIN2_1 1 +
chr1 8376144 8380144 SLC45A1_1 1 +
chr1 16765166 16769166 NECAP2_1 1 +
chr1 33544713 33548713 AZIN2_2 1 +
chr1 25069759 25073759 CLIC4_1 1 +
chr1 33544729 33548729 AZIN2_3 1 +
chr1 50487626 50491626 AGBL4_1 1 -
chr1 92349836 92353836 TGFBR3_1 1 -
複数回出現する遺伝子の名前だけを変更したい場合は、もう少し複雑になります。
$ awk -vOFS="\t" '(++a[$4]>1){$4=$4"_"a[$4]-1}1;' file.gff
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
答え2
awkを使う
awk -vOFS="\t" '{$4=a[$4]++?$4"_"a[$4]-1:$4}1' file
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
1回だけ発生した場合は、$ 4を自分と同じに設定するか、_
発生回数に-1を追加します。