我使用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=
,但是如果我可以选择两者,那么这将是一个开始......
答案 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