【问题标题】:Sed inside a while read loopsed 在 while 读取循环中
【发布时间】:2017-12-09 15:17:53
【问题描述】:

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

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

cat Input_File.txt |同时读取 var;做回声 $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

输出正是我想要的如下:

    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 "$Otu" -A 10 Multi_BLAST_5814.txt >> Multi_BLAST_Subset.txt;完毕

$ cat Input_File.txt |一边读奥图;做 sed -n "/$Otu/,+10p" Multi_BLAST_5814.txt >> Multi_BLAST_Subset.txt;完毕

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

【问题讨论】:

  • 关于questions and answers about using sed within a while loop 的唯一重要问答是 Q) 我应该在 while 循环中使用 sed 来操作文本吗? A) 没有。见why-is-using-a-shell-loop-to-process-text-considered-bad-practice。 [editt] 您的问题包括简洁、可测试的样本输入和预期输出,我们可以帮助您以正确的方式做任何事情。

标签: sed while-loop


【解决方案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.

【讨论】:

  • grep 命令也不起作用...至少使用 grep,命令完成,但输出文件中没有任何内容
  • @BrettOlds:试试grep -Ff your700VarList.txt -A 10 bigFile &gt; smallerFileman grep 了解正在发生的事情,或在此处搜索类似的问题。如果您的数据没有让您失望,您可以通过一次调用 grep 来做到这一点。不是 700。祝你好运。
  • @shellter :那更接近了,我确实找到了最后一个搜索项,但只有一个。我尝试将其更改为附加以下命令:grep -Ff your700VarList.txt -A 10 bigFile >> smallFile。但这也只返回一个条目
  • @BrettOlds 检查输入文件的换行符。如果它们是 Window 的 \r\n,这可能会解释您的问题,因为 grep -Ffread 会将 \rs 视为标准字符,您最终会在更大的文件中搜索 yourVar\r。有点疯狂的猜测,但这可以解释最后一个 var 如果后面没有换行符的不同行为
  • @BrettOlds :是的,同意 \r\n 行尾。通过cat -vet your700VarList.txt 寻找他们。如果您在行尾看到^M$,则使用dos2unix your700*。您可能还需要检查您的bigFile。祝你好运。
【解决方案2】:

不确定您是否已经尝试过,但请尝试将问题分解为更小的部分。下面的简单示例:

$ 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
$

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2018-04-17
    • 2020-03-26
    • 2013-07-08
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2012-10-18
    • 2019-05-06
    相关资源
    最近更新 更多