如何从文件中的列表中 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
中。参见 。
我有一个文件 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
中。参见