提取切割结果的两个字符串之间的字符串

时间:2014-11-12 14:04:11

标签: string bash perl awk grep

我使用cut来提取制表符分隔文件中的列:

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 ';'

忽略SYMBOL=,但是如果我可以选择两者,那么这将是一个开始......

5 个答案:

答案 0 :(得分:4)

如果你不介意使用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

答案 1 :(得分:4)

可以使用grep和后视:

来完成
... | grep -Po '(?<=SYMBOL=)[^;]*'
GLRA3
GLRA3

[^;]*之后发生SYMBOL=[^;]*表示“找到;之前的任何字符集”。


请注意,您距离解决方案并不遥远。如果您使用-o执行以下操作,则可以打印SYMBOL=之后的内容,直到找到;

... | grep -o 'SYMBOL=[^;]*'
SYMBOL=GLRA3
SYMBOL=GLRA3

然后您可以添加-P选项来执行\K,这会删除以前匹配的文本,然后打印下一步:

... | grep -Po 'SYMBOL=\K[^;]*'
GLRA3
GLRA3

答案 2 :(得分:1)

您不需要一堆不同的命令和管道,只需要一个简单的awk命令。看,假设你有这个当前运行的标签分隔文件:

$ 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以获取真实文件。

如果&#34; SYMBOL&#34;并不总是在同一个位置,只需创建一个数组映射名称到值,并按名称打印您喜欢的任何值:

$ 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

答案 3 :(得分:0)

你甚至可以在perl one liner中试试这个:

<强> INPUTFILE:

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

代码:( Windows提示)

perl -lne "if($_ =~ /SYMBOL=(.*?[^;]);/i) { print $1;}" InputFile

外壳提示:

perl -lne 'if($_ =~ /SYMBOL=(.*?[^;]);/i) { print $1;}' InputFile

<强>输出:

GLRA3
GLRA3

答案 4 :(得分:0)

使用perl如果你在;=上分开,你可以为每个errm“gene”构建哈希哈希值 (?)或文件中的行。此示例使用“主题”变量$_ %_和“autosplit”数组@F(使用-a制作,-F查看perlrun了解详细信息在开关上)从默认值中打印出“SYMBOL”键的值(%_):

perl -F"/;|=/" -anE '$_{$.}={@F} ;}{ say $_{$_}{SYMBOL} for keys %_' data.txt

通过更改密钥,您可以选择要打印的值 - 例如

perl -F"/;|=/" -anE '$_{$.}={@F} ;}{ say $_{$_}{CCDS} for keys %_' data.txt

当然也可以使用一系列哈希:

perl -F"/;|=/" -anE 'push @genes, {@F} ;}{ say ${$_}{CCDS} for @genes' data.txt

我发现如果我立即开始使用数据结构(即使在单行中),它​​也可以更容易地开始想象更长的脚本或应用程序。最好的工具之一是Data::Printer,它可以让你“看到”哈希和数组:perl -MDDP -F"/;|=/" -lane '$_{$.}={@F};}{ p %_' data.txt