我正在尝试重新格式化"orthologsClassification.tsv"文件包含除了两个句号之间的文本以外的所有内容。我想:
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.ZNF254.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.ZNF254.2637
成为:
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
我已经试过了:
awk '{sub(/..*$/, "", $4)} 1' OFS='t' orthologsClassification.tsv
,但这删除了包括第4列第一个周期在内及之后的所有内容(因此ENST00000616028. znf254.2177变成ENST00000616028,当我真正想要ENST00000616028.2177)。
任何想法?谢谢你!
使用正则表达式的awk
想法:
$ awk 'BEGIN{FS=OFS="t"} FNR>1 {sub(/.[^.]*./,".",$4)} 1' orthologsClassification.tsv
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
另一个使用split
在$4
上提取第1和第3个周期分隔子字段的awk
想法:
$ awk 'BEGIN{FS=OFS="t"} FNR>1 {split($4,a,".");$4=a[1]"."a[3]} 1' orthologsClassification.tsv
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
正则表达式
awk '{sub(/..*$/, "", $4)} 1' OFS='t' orthologsClassification.tsv
表示贪婪地匹配文本.
之后的所有内容到字符串的末尾,使用
awk '{sub(/.[^.]*/, "", $4)} 1' OFS='t' orthologsClassification.tsv
,你将得到期望的行为-它匹配0或更多的非点后的文字点(第一个文字点),并删除它
$ awk -F. 'BEGIN{OFS=FS}NR>1{$(NF-1)=$NF;sub(/.[^.]*$/,"")}1' file
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
对于您提供的示例,您所需要的是:
$ sed 's/.[^t]*././' file
t_gene t_transcript q_gene q_transcript
ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177
ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
awk -F'.[^ t]*.' NF=NF OFS=.