一段时间内读取循环

时间:2017-07-05 19:58:22

标签: sed while-loop

我一直在阅读很多关于在while循环中使用sed的问题和答案。我认为我的命令正确,但是一旦把所有部分放在一起,我似乎没有输出。有人能告诉我我错过了什么吗?

我有一个包含700个变量的输入文件,每行一个。我需要在sed命令中使用这700个变量中的每一个。我运行以下命令来验证变量输出是否正确:

  

cat Input_File.txt |而读取var;做echo $ var;完成

然后我尝试按如下方式添加sed命令:

  

cat Input_File.txt |而读取var;做sed -n" / $ var /,+ 10p" Multi-BLAST_5814.txt>> Multi_BLAST_Subset;完成

这个命令让我没有错误,但闪烁的光标好像这是一个无限循环。它应该使用700个变量中的每一个,找到Multi_BLAST_5814.txt中的相应行,并将搜索变量行和搜索项之后的10行输出到一个新文件中,随后追加每个变量。我可以使用手动设置的单值变量单独执行sed命令,我可以使用输入文件成功执行while循环。有人想过为什么这不起作用吗?

用户,这正是我在这一点上所做的。

我有一个带有BLAST输出的大文本文件(128 MB)。我需要搜索769个样本的结果子集(在文件中的5814个样本中)。

我创建了一个包含769个样本名称的.txt文件。

为了测试grep和sed,我手动分配了一个变量,其中包含我需要搜索的769个样本名称之一,可以得到我需要的结果,如下所示:

$ Otu="S41_Folmer_Otu96;size=12;"
$ grep $Otu -A 10 Multi_BLAST_5814.txt
            OR

$ sed -n" / $ Otu /,+ 10p" Multi_BLAST_5814.txt

OUTPUT正是我想要的如下:

    Query= S41_Folmer_Otu96;size=12;
    Length=101

    Sequences producing significant alignments:       Score(Bits)  E Value

    gi|58397553|gb|AY830431.1|  Scopelocheirus schellenbergi clone...   180    1E-41
    gi|306447543|gb|HQ018876.1|  Liposcelis paeta isolate CZ cytoc...   174    6E-40
    gi|306447533|gb|HQ018871.1|  Liposcelis decolor isolate CQ cyt...   104    9E-19
    gi|1043259532|gb|KX130860.1|  Batocera rufomaculata isolate Br...   99    4E-17
    gi|987210821|gb|KR141076.1|  Psocoptera sp. BOLD:ACO1391 vouch...   81    1E-11

要测试以确保输入文件包含正确的变量,我运行以下命令:

$ Cat Input_File.txt
$ while read Otu; do echo $Otu; done <Input_File.txt

    S41_Folmer_Otu96;size=12;
    S78_Folmer_Otu15;size=538;
    S73_Leray_Otu52;size=6;
    S66_Leray_Otu93;size=6;
    S10_Folmer_Otu10;size=1612;
    ... All 769 variables

同样,这正是我所期望的,也是正确的。

但是,当我执行以下任一命令时,屏幕上没有任何内容(如果我不写写文件/追加操作)或者我需要创建的文件。

  

$ cat Input_File.txt |读奥图时;做grep&#34; $ Otu&#34; -A 10 Multi_BLAST_5814.txt&gt;&gt; Multi_BLAST_Subset.txt; DONE      

$ cat Input_File.txt |读奥图时;做sed -n&#34; / $ Otu /,+ 10p&#34; Multi_BLAST_5814.txt&gt;&gt; Multi_BLAST_Subset.txt; DONE

Sed挂起并且永远不会关闭,让我处于一个闪烁的光标。 Grep完成但也没有输出。我不知道为什么这不起作用。一切都是有效的,所以我可能会手动搜索所有769份样本进行复制/粘贴。

2 个答案:

答案 0 :(得分:1)

如果您有权访问GNU grep,则无需sed命令,grep "$var" -A 10将执行相同的操作,如果$var包含sed,则不会中断您的man grep命令中使用的分隔符。

来自 -A NUM, --after-context=NUM Print NUM lines of trailing context after matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given.

l = [a, a, a, b, b, c]

desired1 = [a, a, a]

desired2 = [b, b]

desired3 = [c]

答案 1 :(得分:1)

不确定您是否已尝试过但尝试将问题分解为较小的块。以下简单示例:

$ cat Input_File.txt 
one
two
three
$

$ cat file.txt 
This is line one
This is line two
This is line three
This is another four
This is another five
This is another six
This is another seven
$

$ cat Input_File.txt | while read var ; do echo $var ; sed -n "/$var/,+1p" file.txt ; done
one
This is line one
This is line two
two
This is line two
This is line three
three
This is line three
This is another four
$