从文件中读取行,在第二个文件中读取grep,并为每个$行输出一个文件

时间:2017-06-21 17:25:45

标签: bash awk grep

我有以下两个文件:

sequences.txt

158333741       Acaryochloris_marina_MBIC11017_uid58167 158333741       432     1       432     COG0001 0
158339504       Acaryochloris_marina_MBIC11017_uid58167 158339504       491     1       491     COG0002 0
379012832       Acetobacterium_woodii_DSM_1030_uid88073 379012832       430     1       430     COG0001 0
302391336       Acetohalobium_arabaticum_DSM_5501_uid51423      302391336       441     1       441     COG0003 0
311103820       Achromobacter_xylosoxidans_A8_uid59899  311103820       425     1       425     COG0004 0
332795879       Acidianus_hospitalis_W1_uid66875        332795879       369     1       369     COG0005 0
332796307       Acidianus_hospitalis_W1_uid66875        332796307       416     1       416     COG0005 0

allids.txt

COG0001
COG0002
COG0003
COG0004
COG0005

现在我想阅读allids.txt中的每一行,搜索sequences.txt中的所有行(特别是第7列),并为line中的每个allids.txt写一个文件文件名为$line

我的方法是使用简单的grep:

while read line; do
  grep "$line" sequences.txt
done <allids.txt

但是我在哪里加入输出命令? 如果有更快的命令,请随时提出建议!

我的预期输出:

COG0001.txt

158333741       Acaryochloris_marina_MBIC11017_uid58167 158333741       432     1       432     COG0001 0
379012832       Acetobacterium_woodii_DSM_1030_uid88073 379012832       430     1       430     COG0001 0

COG0002.txt

158339504       Acaryochloris_marina_MBIC11017_uid58167 158339504       491     1       491     COG0002 0

[and so on]

3 个答案:

答案 0 :(得分:5)

使用awk

这么做非常简单
awk 'NR==FNR{ids[$1]; next} $7 in ids{print > ($7 ".txt")}' allids.txt sequences.txt

参考: Effective AWK Programming

答案 1 :(得分:2)

我怀疑你真正需要的是:

awk '{print > ($7".txt")}' sequences.txt

怀疑是基于您的ID文件被命名为allIds.txt(请注意所有)并且sequences.txt中没有ID不存在于{ {1}}。

答案 2 :(得分:-2)

扩展你的方法,这似乎有效:

while read line; do
  # touching is not necessary as pointed out by @123
  # touch "$line.txt" 
  grep "$line" sequences.txt > "$line.txt"
done <allids.txt

它生成具有所需输出的文本文件。但我不能评论这种方法的效率。

编辑

正如评论中指出的那样,这种方法很慢,并且会违反任何违反答案中未使用的假设的文件。我将它留在这里让人们看看快速而苛刻的解决方案如何适得其反。