awk 및 정규 표현식을 사용하여 테이블의 특정 열에서 문자열을 바꾸는 방법은 무엇입니까?

awk 및 정규 표현식을 사용하여 테이블의 특정 열에서 문자열을 바꾸는 방법은 무엇입니까?

저는 생물정보학을 공부하고 있지만 장기적인 경험이 없어서 awk막혔습니다.

13개의 열이 있는 테이블이 있습니다.

ELL1-XXXXXXXXX9열에는 (예: ELL1-II_EC_cell1) 또는 CDK8-XXXXXX(예: ) 와 같은 다양한 문자열 변형이 있습니다 CDK8-213_mCdk8_ChIPseq_Tnaive_stim_CDK8-214_mCdk8_ChIPseq_Tnaive_stim_AS.

변경 ELL1-XXXXX하고 싶은 문자열 변형이 200개가 넘고 다른 문자열도 더 간단한 문자열로 변경하고 싶습니다.ELL1CDK8

나는 노력했다

awk -F '\t' '{gsub("CDK8-213_mCdk8_ChIPseq_Tnaive_stim_CDK8-214_mCdk8_ChIPseq_Tnaive_stim_AS","CDK8",$9); print}' input.lst > output.lst && mv output.lst input.lst

그런데 그 문자열을 하나씩 찾아서 바꿔야 합니다. 수많은 포럼 스레드를 읽었지만 내 파일에 작동하는 명령을 찾을 수 없습니다.

다음은 입력으로 사용되는 4개의 예제 라인입니다.

DRX154054   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL1-II_EC_cell121  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  
DRX154053   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL2-II_EC_cell210  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/  
ERX3608304  ILLUMINA    SINGLE  ChIP-Seq    mm_Unknown_Unknown  Mus_musculus    None    No  EP1-BCL6-Fast-C57-Rep1-ChIP-seq NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ 
DRX154052   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  DNMT3A-Dnmt3a1_BioChIPSeq_r1    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  

예상 출력:

DRX154054   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL1    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  
DRX154053   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL2    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/
ERX3608304  ILLUMINA    SINGLE  ChIP-Seq    mm_Unknown_Unknown  Mus_musculus    None    No  EP1 NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ 
DRX154052   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  DNMT3A  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  

보시다시피 다음 문자열이 대체되었습니다.

ELL1-II_EC_cell121 -> ELL1

ELL2-II_EC_cell210 -> ELL2

EP1-BCL6-Fast-C57-Rep1-ChIP-seq -> EP1

DNMT3A-Dnmt3a1_BioChIPSeq_r1 -> DNMT3A

답변1

탭으로 구분된 데이터를 가정하면 다음과 같습니다.

$ awk -F '\t' -v OFS='\t' '{ sub("-.*", "", $9); print }' file
DRX154054       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL1    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/
DRX154053       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL2    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/
ERX3608304      ILLUMINA        SINGLE  ChIP-Seq        mm_Unknown_Unknown      Mus_musculus    None    No  EP1      NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/
DRX154052       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      DNMT3A  NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/

이는 단순히 9번째 필드에 대체를 적용하여 첫 번째 대시 문자로 시작하는 해당 필드의 모든 항목을 제거합니다. 그런 다음 수정된 데이터를 인쇄합니다.

정규식은 -.*첫 번째 항목부터 시작하여 일치하며 -(문자 그대로 "a -뒤에 0개 이상의 문자가 옵니다") sub()9번째 필드에 빈 대체 문자열을 사용하면 해당 필드의 모든 텍스트 일치 항목이 제거됩니다. gsub()입력 라인당 하나의 교체만 수행하면 되므로 여기서는 이를 사용할 필요가 없습니다 .

필드 중 하나를 수정했으므로 출력 필드 구분 기호( )가 탭으로 설정되어 있는지도 확인해야 합니다. OFS그렇지 않으면 출력에서 ​​공백으로 구분된 필드가 표시됩니다. 분명히 블록을 사용하여 이 작업을 수행할 수도 있습니다 BEGIN.

awk 'BEGIN { OFS=FS="\t" } { sub("-.*", "", $9); print }' file

답변2

밀러 사용(https://github.com/johnkerl/miller) 그리고 실행

mlr --tsv --implicit-csv-header --headerless-csv-output put '$9=gsub($9,"-.+$","")' input >output

당신은 할 것

+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
| 1          | 2        | 3      | 4        | 5                                      | 6            | 7    | 8  | 9      | 10 | 11 | 12 | 13                                                                                      |
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
| DRX154054  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | ELL1   | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  |
| DRX154053  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | ELL2   | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/  |
| ERX3608304 | ILLUMINA | SINGLE | ChIP-Seq | mm_Unknown_Unknown                     | Mus_musculus | None | No | EP1    | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ |
| DRX154052  | ILLUMINA | SINGLE | ChIP-seq | mm_embryonicstemcell_embryonicstemcell | Mus_musculus | None | No | DNMT3A | NA | NA | NA | ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  |
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+

답변3

사용 substrindex

awk -F '\t' '{$9=substr($9, 0, index($9, "-")-1); print}' input.lst > output.lst && mv output.lst input.lst

관련 정보