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

ror*_*oro 3 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
Run Code Online (Sandbox Code Playgroud)

allids.txt

COG0001
COG0002
COG0003
COG0004
COG0005
Run Code Online (Sandbox Code Playgroud)

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

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

while read line; do
  grep "$line" sequences.txt
done <allids.txt
Run Code Online (Sandbox Code Playgroud)

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

我的预期产量:

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
Run Code Online (Sandbox Code Playgroud)

COG0002.txt

158339504       Acaryochloris_marina_MBIC11017_uid58167 158339504       491     1       491     COG0002 0
Run Code Online (Sandbox Code Playgroud)

[and so on]

anu*_*ava 5

使用awk以下方法非常简单:

awk 'NR==FNR{ids[$1]; next} $7 in ids{print > ($7 ".txt")}' allids.txt sequences.txt
Run Code Online (Sandbox Code Playgroud)

参考: 有效的AWK编程