对于列中的所有内容,删除两个句号之间的文本



我正在尝试重新格式化"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=.

最新更新