我正在学习生物信息学,但我没有长期的经验,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
,我想将其更改为ELL1
or 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
使用substr
和index
awk -F '\t' '{$9=substr($9, 0, index($9, "-")-1); print}' input.lst > output.lst && mv output.lst input.lst