String 在剪切结果的两个字符串之间提取字符串

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.

我正在使用“剪切”提取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.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。