String 在剪切结果的两个字符串之间提取字符串
我正在使用“剪切”提取tab delim文件中的列:String 在剪切结果的两个字符串之间提取字符串,string,bash,perl,awk,grep,String,Bash,Perl,Awk,Grep,我正在使用“剪切”提取tab delim文件中的列: cut -f 14 glra3res.vcf 其结果是: STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CANONICAL=YES;CCDS=CCDS54942.1;ENSP=ENSP00000411593;SWISSPROT=P23415;UNIPARC=UPI0000DA6BF2;SIFT=deleterious(0.
cut -f 14 glra3res.vcf
其结果是:
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CANONICAL=YES;CCDS=CCDS54942.1;ENSP=ENSP00000411593;SWISSPROT=P23415;UNIPARC=UPI0000DA6BF2;SIFT=deleterious(0.02);PolyPhen=benign(0.167);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000455880.2:c.1363C>A;HGVSp=ENSP00000411593.2:p.His455Asn;AA_MAF=T:0;EA_MAF=T:0.000116
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CCDS=CCDS4320.1;ENSP=ENSP00000274576;SWISSPROT=P23415;TREMBL=Q14C71;UNIPARC=UPI000013DA17;SIFT=deleterious(0.02);PolyPhen=benign(0.315);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000274576.6:c.1339C>A;HGVSp=ENSP00000274576.4:p.His447Asn;AA_MAF=T:0;EA_MAF=T:0.000116
我想提取SYMBOL=
和之间的字符串代码>,这将导致GLRA3
我正在尝试将其导入grep
命令:
cut -f 14 glra1res.vcf | grep 'SYMBOL='
这当然会选择SYMBOL=
,我也只能选择代码>。我很难将两者结合起来,以获得它们之间的联系。简单地做
cut -f 14 glra1res.vcf | grep 'SYMBOL=' | grep ';'
忽略符号=
,我想如果我可以同时选择这两个符号,那么这将是一个开始….如果您不介意使用sed:
bash-3.2$ cut -f 14 myfile | sed 's/.*SYMBOL=\([^;]*\);.*/\1/g'
GLRA3
GLRA3
仅使用带有-d
选项的剪切:
bash-3.2$ cut -f 14 myfile | cut -d';' -f 2|cut -d'=' -f 2
GLRA3
GLRA3
这可以通过grep
完成,并向后看:
... | grep -Po '(?<=SYMBOL=)[^;]*'
GLRA3
GLRA3
然后,您可以添加-p
选项以执行\K
,该选项将删除先前匹配的文本并只打印接下来的内容:
... | grep -Po 'SYMBOL=\K[^;]*'
GLRA3
GLRA3
您不需要一堆不同的命令和管道,只需要一个简单的awk命令。看,假设您有一个选项卡分隔的文件,您当前正在该文件上运行cut:
$ cat file
abc STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC def
gh STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC ij
$ cut -f2 file
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC
现在只需在其上运行此awk脚本即可:
$ awk -F'\t' '{split($2,a,/[;=]/); print a[4]}' file
GLRA3
GLRA3
将真实文件的$2
更改为$14
如果“SYMBOL”不总是在同一位置,只需创建一个数组,将名称映射到值,并按名称打印您喜欢的任何值:
$ awk -F'\t' '{split($2,a,/[;=]/); for (i=1;i in a;i+=2) n2v[a[i]]=a[i+1]; print n2v["SYMBOL"]}' file
GLRA3
GLRA3
$ awk -F'\t' '{split($2,a,/[;=]/); for (i=1;i in a;i+=2) n2v[a[i]]=a[i+1]; print n2v["STRAND"]}' file
-1
-1
$ awk -F'\t' '{split($2,a,/[;=]/); for (i=1;i in a;i+=2) n2v[a[i]]=a[i+1]; print n2v["SYMBOL_SOURCE"]}' file
HGNC
HGNC
$ awk -F'\t' '{
split($2,a,/[;=]/)
for (i=1;i in a;i+=2) {
n2v[a[i]]=a[i+1]
}
for (name in n2v) {
print name, "->", n2v[name]
}
}' file
SYMBOL -> GLRA3
STRAND -> -1
SYMBOL_SOURCE -> HGNC
SYMBOL -> GLRA3
STRAND -> -1
SYMBOL_SOURCE -> HGNC
您甚至可以在perl one liner中尝试这一点:
输入文件:
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CANONICAL=YES;CCDS=CCDS54942.1;ENSP=ENSP00000411593;SWISSPROT=P23415;UNIPARC=UPI0000DA6BF2;SIFT=deleterious(0.02);PolyPhen=benign(0.167);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000455880.2:c.1363C>A;HGVSp=ENSP00000411593.2:p.His455Asn;AA_MAF=T:0;EA_MAF=T:0.000116
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CCDS=CCDS4320.1;ENSP=ENSP00000274576;SWISSPROT=P23415;TREMBL=Q14C71;UNIPARC=UPI000013DA17;SIFT=deleterious(0.02);PolyPhen=benign(0.315);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000274576.6:c.1339C>A;HGVSp=ENSP00000274576.4:p.His447Asn;AA_MAF=T:0;EA_MAF=T:0.000116
perl -lne 'if($_ =~ /SYMBOL=(.*?[^;]);/i) { print $1;}' InputFile
GLRA3
GLRA3
代码:(Windows提示)
Shell提示符:
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CANONICAL=YES;CCDS=CCDS54942.1;ENSP=ENSP00000411593;SWISSPROT=P23415;UNIPARC=UPI0000DA6BF2;SIFT=deleterious(0.02);PolyPhen=benign(0.167);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000455880.2:c.1363C>A;HGVSp=ENSP00000411593.2:p.His455Asn;AA_MAF=T:0;EA_MAF=T:0.000116
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CCDS=CCDS4320.1;ENSP=ENSP00000274576;SWISSPROT=P23415;TREMBL=Q14C71;UNIPARC=UPI000013DA17;SIFT=deleterious(0.02);PolyPhen=benign(0.315);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000274576.6:c.1339C>A;HGVSp=ENSP00000274576.4:p.His447Asn;AA_MAF=T:0;EA_MAF=T:0.000116
perl -lne 'if($_ =~ /SYMBOL=(.*?[^;]);/i) { print $1;}' InputFile
GLRA3
GLRA3
输出:
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CANONICAL=YES;CCDS=CCDS54942.1;ENSP=ENSP00000411593;SWISSPROT=P23415;UNIPARC=UPI0000DA6BF2;SIFT=deleterious(0.02);PolyPhen=benign(0.167);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000455880.2:c.1363C>A;HGVSp=ENSP00000411593.2:p.His455Asn;AA_MAF=T:0;EA_MAF=T:0.000116
STRAND=-1;SYMBOL=GLRA3;SYMBOL_SOURCE=HGNC;HGNC_ID=HGNC:4326;BIOTYPE=protein_coding;CCDS=CCDS4320.1;ENSP=ENSP00000274576;SWISSPROT=P23415;TREMBL=Q14C71;UNIPARC=UPI000013DA17;SIFT=deleterious(0.02);PolyPhen=benign(0.315);EXON=9/9;DOMAINS=Superfamily_domains:SSF90112;HGVSc=ENST00000274576.6:c.1339C>A;HGVSp=ENSP00000274576.4:p.His447Asn;AA_MAF=T:0;EA_MAF=T:0.000116
perl -lne 'if($_ =~ /SYMBOL=(.*?[^;]);/i) { print $1;}' InputFile
GLRA3
GLRA3
如果在两个上拆分,则使用perl
和=
您可以为每个errm“基因”构建散列
(?)或文件中的行。此示例使用“topic”变量$\ucode>%\ucode>和“autosplit”数组@F
(由-a
制成,-F
请参阅开关的详细信息)从默认has(%\ucode>)打印出“SYMBOL”键的值:
这样,您可以通过更改键来选择要打印的值-例如:
当然,也可以使用哈希数组:
perl -F"/;|=/" -anE 'push @genes, {@F} ;}{ say ${$_}{CCDS} for @genes' data.txt
我发现,如果我立即开始使用数据结构(即使是在一行中),就可以更容易地开始想象更长的脚本或应用程序。实现这一点的最佳工具之一是,它允许您“查看”散列和数组:perl-MDDP-F/;|=/“-lane'${$.}={@F};}{p%\'data.txt
呃,你有grep-Po
吗?当我发布我的答案时,它不在这里,现在我看到了,我不想看到我的答案作为你的副本:)@fedorqui你在我之前发布过。但是我在我完成键入后看到了你的答案。正如你比我解释得更清楚的那样,我删除了grep部分。哦,你没有我必须这样做。无论如何,对于提供的多个解决方案,+1。我在这里的选择有点被宠坏了。我熟悉sed,但也使用conequalitive cut命令是一个好主意。酷!!不知道\K。