如何从文件中的列表中 grep,其中每一行都包含 space。使用属和种

How can I grep from a list in a file where each line includes a space. Working with genus and species

我有一个文件 organisms.txt 每行一个生物体(属和种)。

Escherichia coli
Staphylococcus aureus
Prevotella sp. 855
Saprospirales
Candidatus Accumulibacter phosphatis

我想使用 grep 搜索每个生物体的另一个文件,并将匹配项写入带有生物体名称的输出文件。我的文件 large_file.txt 是这样的:

Parcubacteria bacterium    0    87    2762014
Saprospirales    837    78    1936988
Escherichia coli    857    95    562
Bacteroides ihuae    12    100    1852362
Candidatus Escherichia coli O12H3    988    95    888
Dialister invisus    30    86    218538
Fake Escherichia bacterium    112    99    110
Escherichia coli 07798    1094    99   1005566
Escherichia coli    14    87    562
Saprospirales bacterium    87    98.6    4587674
Saprospirales sp.    12588    99    1936988

我正在使用这个 while 循环。

while IFS= read -r line
do
out="${line}_hits.txt"
grep "${line}" large_file.txt
> "$out"
done < "organisms.txt"

我已经手动检查了我列表中的生物,以验证它们是否在 large_file.txt 中找到并且它们肯定在 large_file.txt 中找到。输出文件都是使用此循环创建的,但它们都是空的。例如,我希望输出文件 Escherichia coli_hits.txt 看起来像这样:

    Escherichia coli    857    95    562
    Candidatus Escherichia coli O12H3    988    95    888
    Escherichia coli 07798    1094    99   1005566
    Escherichia coli    14    87    562 

我希望输出文件 Saprospirales_hits.txt 看起来像这样:

Saprospirales    837    78    1936988
Saprospirales bacterium    87    98.6    4587674
Saprospirales sp.    12588    99    1936988

我还希望创建一个名为 Staphylococus aureus_hits.txt 的文件,并且它是一个空文件以及 organisms.txt 中所有其他行的类似文件,但在 [=17] 中找不到=].

我需要更改什么才能获得我想要的结果?

重定向到 "$out" 的方式会在每次循环迭代时截断文件:

grep "$line" large_file.txt
> "$out" # This truncates the file

这并不能解决问题:

grep "$line" large_file.txt > "$out"

因为现在,文件 $out 只包含 grep 的最新结果。您应该附加:

grep "$line" large_file.txt >> "$out"

这仍然会为每次迭代打开和关闭一个文件句柄,但是因为输出文件名取决于正在读取的行,所以您不能将重定向移到循环之外。

根据您描述的症状,我猜您的 organisms.txt 有 DOS 行结尾,因此您脚本中的 line 总是以 \r 结尾,因此 Escherichia coli\r,例如,从未出现在 large_file.txt 中。参见