如何使用 awk 和正则表达式替换表的给定列中的字符串?

如何使用 awk 和正则表达式替换表的给定列中的字符串?

我正在学习生物信息学,但我没有长期的经验,awk现在我陷入了困境。

我有一个有 13 列的表。

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

我有超过 200 个字符串变体ELL1-XXXXX,我想将其更改为ELL1or CDK8,并且我也想将其他字符串更改为更简单的字符串。

我试过

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-后跟零个或多个任何字符”),并且将其与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

相关内容