我有以下两个文件:
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]
答案 0 :(得分:5)
使用awk
:
awk 'NR==FNR{ids[$1]; next} $7 in ids{print > ($7 ".txt")}' allids.txt sequences.txt
答案 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
它生成具有所需输出的文本文件。但我不能评论这种方法的效率。
编辑:
正如评论中指出的那样,这种方法很慢,并且会违反任何违反答案中未使用的假设的文件。我将它留在这里让人们看看快速而苛刻的解决方案如何适得其反。