首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用awk和regex替换表中给定列中的字符串?

如何使用awk和regex替换表中给定列中的字符串?
EN

Unix & Linux用户
提问于 2019-12-14 13:55:57
回答 3查看 1.6K关注 0票数 3

我正在学习生物信息学,但是我对awk没有很长的经验,现在我被困住了。

我有一张13栏的桌子。

在第9栏中,我有许多字符串的变体,如ELL1-XXXXXXXXX (例如ELL1-II_EC_cell1)或CDK8-XXXXXX (例如CDK8-213_mCdk8_ChIPseq_Tnaive_stim_CDK8-214_mCdk8_ChIPseq_Tnaive_stim_AS)。

我有>200个变体的ELL1-XXXXX字符串,我想要更改为ELL1CDK8,我也想将其他字符串更改为更简单的字符串。

我试过了

代码语言:javascript
复制
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个示例行作为输入:

代码语言:javascript
复制
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/  

预期产出:

代码语言:javascript
复制
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

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2019-12-26 14:53:06

假设有制表符分隔的数据:

代码语言:javascript
复制
$ 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/

这只是将替换应用到第九个字段,从该字段中的第一个破折号开始删除所有内容。然后打印修改后的数据。

正则表达式-.*将从第一个-开始匹配(字面意思是“匹配一个-,后面有任何字符的零或多个字符”),使用该表达式sub()和第9个字段上的空替换字符串将删除该字段中所有匹配的文本。请注意,这里不需要使用gsub(),因为我们只需要在输入行中执行一次替换操作。

由于我们修改了其中一个字段,我们还必须确保将输出字段分隔符(OFS)设置为制表符,否则输出中将得到空格分隔的字段。很明显,您也可以使用BEGIN块来完成这个任务:

代码语言:javascript
复制
awk 'BEGIN { OFS=FS="\t" } { sub("-.*", "", $9); print }' file
票数 2
EN

Unix & Linux用户

发布于 2019-12-21 11:39:49

使用Miller (https://github.com/johnkerl/miller)并运行

代码语言:javascript
复制
mlr --tsv --implicit-csv-header --headerless-csv-output put '$9=gsub($9,"-.+$","")' input >output

你将会有

代码语言:javascript
复制
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
| 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/  |
+------------+----------+--------+----------+----------------------------------------+--------------+------+----+--------+----+----+----+-----------------------------------------------------------------------------------------+
票数 1
EN

Unix & Linux用户

发布于 2019-12-26 14:09:18

使用substrindex

代码语言:javascript
复制
awk -F '\t' '{$9=substr($9, 0, index($9, "-")-1); print}' input.lst > output.lst && mv output.lst input.lst
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/557210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档