Bash 同一行上的多个grep输出

Bash 同一行上的多个grep输出,bash,grep,echo,cut,Bash,Grep,Echo,Cut,这似乎是一个非常琐碎的问题,但我自己没有足够的经验使用grep和echo来回答这个问题。我已经看过了,但没有成功 我有一个文件,像这样开始(.gff文件),超过1000000行 NW_007577731.1 RefSeq region 1 3345205 . + . ID=id0;Dbxref=taxon:144197;Name=Unknown;chromosome=Unknown;collection-date=16-Aug-2005;country=USA: Emera

这似乎是一个非常琐碎的问题,但我自己没有足够的经验使用
grep
echo
来回答这个问题。我已经看过了,但没有成功

我有一个文件,像这样开始(.gff文件),超过1000000行

NW_007577731.1  RefSeq  region  1   3345205 .   +   .   ID=id0;Dbxref=taxon:144197;Name=Unknown;chromosome=Unknown;collection-date=16-Aug-2005;country=USA: Emerald Reef%2C Florida;gbkey=Src;genome=genomic;isolate=25-593;lat-lon=25.6748 N 80.0982 W;mol_type=genomic DNA;sex=male
NW_007577731.1  Gnomon  gene    7982    24854   .   -   .   ID=gene0;Dbxref=GeneID:103352799;Name=LOC103352799;gbkey=Gene;gene=LOC103352799;gene_biotype=protein_coding
NW_007577731.1  Gnomon  mRNA    7982    24854   .   -   .   ID=rna0;Parent=gene0;Dbxref=GeneID:103352799,Genbank:XM_008279367.1;Name=XM_008279367.1;gbkey=mRNA;gene=LOC103352799;model_evidence=Supporting evidence includes similarity to: 22 Proteins%2C and 73%25 coverage of the annotated genomic feature by RNAseq alignments;product=homer protein homolog 3-like;transcript_id=XM_008279367.1
NW_007577731.1  RefSeq  region  1   3345205 .   +   .   ID=id0;Dbxref=taxon:144197;Name=Unknown;chromosome=Unknown;collection-date=16-Aug-2005;country=USA: Emerald Reef%2C Florida;gbkey=Src;genome=genomic;isolate=25-593;lat-lon=25.6748 N 80.0982 W;mol_type=genomic DNA;sex=male
NW_007577731.1  Gnomon  gene    7982    24854   .   -   .   ID=gene0;Dbxref=GeneID:103352799;Name=LOC103352799;gbkey=Gene;gene=LOC103352799;gene_biotype=protein_coding
NW_007577731.1  Gnomon  mRNA    7982    24854   .   -   .   ID=rna0;Parent=gene0;Dbxref=GeneID:103352799,Genbank:XM_008279367.1;Name=XM_008279367.1;gbkey=mRNA;gene=LOC103352799;model_evidence=Supporting evidence includes similarity to: 22 Proteins%2C and 73%25 coverage of the annotated genomic feature by RNAseq alignments;product=homer protein homolog 3-like;transcript_id=XM_008279367.1
我想对第三列中包含
mRNA
的行进行grep,以获得这个选项卡分隔的输出(字段
gene=
product=
transcript\u id=
中的值)

由于极度缺乏优雅,我可以使用

grep "mRNA\t" myfile.gff|sed s/gene=/@/|cut -f2 -d"@" |cut -f1 -d";"
grep "mRNA\t" myfile.gff|sed s/product=/@/|cut -f2 -d"@" |cut -f1 -d";"
grep "mRNA\t" myfile.gff|sed s/transcript_id=/@/|cut -f2 -d"@" |cut -f1 -d";"
但是,如何将这3个命令的输出附加到同一行上呢?我试过了

echo -e "`grep "mRNA\t" myfile.gff|sed s/gene=/@/|cut -f2 -d"@" |cut -f1 -d";"`\t`grep "mRNA\t" myfile.gff|sed s/product=/@/|cut -f2 -d"@" |cut -f1 -d";"`\t`grep "mRNA\t" myfile.gff|sed s/transcript_id=/@/|cut -f2 -d"@" |cut -f1 -d";"`"
但结果如下:

LOC103352799
LOC103352799    homer protein homolog 3-like
homer protein homolog 3-like    XM_008279367.1
XM_008279367.1
非常感谢你的帮助

使用awk:

$ awk 'BEGIN {
    FS=OFS="\t"                       # field separators to tab
    k="gene,product,transcript_id"    # keyword list
    split(k,a,",")                    # split keywords to a hash for matching
    for(i in a)                       # values to keys
        p[a[i]]
}
$3=="mRNA" {
    b=""                              # reset buffer b
    split($9,a,"[=;]")                # split the data to a hash
    for(i in a)                       # iterate and search
        if(a[i] in p)                 # ... for keywords, if match, 
            b=b (b==""?"":OFS) a[i+1] # ... value is the next, buffer
    print b                           # output buffer
}' file
LOC103352799    homer protein homolog 3-like    XM_008279367.1
LOC103352799    homer protein homolog 3-like    XM_008279367.1

谈到OneLiner,这里是
sed
中的一个:

sed -nE '/\tmRNA\t/ { s/.*gene=([^;]+).*product=([^;]+).*transcript_id=([^;]+)/\1\t\2\t\3/g;p }' file

唯一的假设是
基因
产品
转录本id
字段的固定顺序。这可以通过一些替换来解决,但考虑到正则表达式的可读性。

尝试“echo-n”(不要添加换行符),我得到相同的输出;)Awk一行。。。brrr@tlorin他们说控制彗星的人用awk单行程序控制彗星…下面是我得到的:
sed:1:“/\tmRNA\t/{s/{s/*gene=(…”:替换命令中的错误标志:'}
对不起,我为GNU-sed写的,现在修复了。你可以再试一次。
sed:1:“/\tmRNA\t/{s/*gene=(…”:在p命令的末尾添加字符
您使用的是哪个sed?(我在Mac上:)
sed -nE '/\tmRNA\t/ { s/.*gene=([^;]+).*product=([^;]+).*transcript_id=([^;]+)/\1\t\2\t\3/g;p }' file