이렇게 많은 행이 있다고 가정해 보겠습니다.
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열에서 반복되는 두 번째 행(및 세 번째, 네 번째 등)을 변경하는 방법을 원합니다. "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 -
한 번만 발생하는 경우 $4를 자신과 동일하게 설정하거나 _
발생 횟수에 -1을 추가합니다.