【发布时间】: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