탭으로 구분된 텍스트 파일에서 중복 행의 열을 변경하는 방법

탭으로 구분된 텍스트 파일에서 중복 행의 열을 변경하는 방법

이렇게 많은 행이 있다고 가정해 보겠습니다.

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을 추가합니다.

관련 정보