我一直在阅读很多关于在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份样本进行复制/粘贴。
答案 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
$