从txt文件池中搜索ID

时间:2016-02-01 09:08:31

标签: python bash file awk

我问了一对一的查询搜索问题,但这个是一对多的文件搜索问题。我有一个包含一千个ID的query.txt文件。

query.txt
GABDI004191
GABDI007217
GABDI004196
GABDI008080
.....

我有一组文件(file1.table,file2.table到file120.table),其中包含对具有其他序列的各个ID的搜索命中。

file1.table
GABDI004191 c23504_g1_i1    29.38   160 100 2   1   160 90  530 
GABDI004191 c20415_g1_i1    45.21   73  39  1   180 252 27  242 
GABDI004191 c17483_g1_i1    88.78   98  11  0   20  117 1   294 
GABDI008080 c1407_g1_i1 95.56   45  2   0   112 156 200 66  9e-25   
GABDI004196 c2892_g1_i1 35.44   79  50  1   37  115 237 4   7e-08

file2.table
GABDI007217 TR9707|c0_g1_i1 32.47   77  49  2   1   77  309 88  
GABDI004196 TR9163|c0_g1_i1 63.77   69  25  0   315 383 207 1   
GABDI007217 TR1165|c0_g1_i1 91.56   154 12  1   1   153 464 3   
GABDI004191 TR4933|c0_g1_i1 91.56   154 12  1   1   153 35  496 
GABDI008080 TR16029|c0_g1_i1    32.20   118 77  2   37  152 242 

我需要从每个ID中提取出每个.table文件中显示的所有行,并将它们存储在带有ID名称的单独文件中。例如。

对于ID GABDI008080 ,它将有一个输出文件 GABDI008080.txt ,其中包含以下内容

GABDI008080 c1407_g1_i1 95.56   45  2   0   112 156 200 66  9e-25
GABDI008080 TR16029|c0_g1_i1    32.20   118 77  2   37  152 242 

对于ID GABDI004191 ,它将有一个输出文件 GABDI004191.txt ,其中包含以下内容

GABDI004191 c23504_g1_i1    29.38   160 100 2   1   160 90  530 
GABDI004191 c20415_g1_i1    45.21   73  39  1   180 252 27  242 
GABDI004191 c17483_g1_i1    88.78   98  11  0   20  117 1   294
GABDI004191 TR4933|c0_g1_i1 91.56   154 12  1   1   153 35  496 

我刚开始学习Python和Bash脚本。 我尝试了以下python代码,但我卡住了。

#!/bin/python
import glob
with open('query.txt' , 'r') as query_file: #reading in IDs from query     file
   for id in query_file:
     for file in glob.glob("*.table"): 
        with open(file, 'r') as one_file: #opening individual files for  reading
           for line in one_file:
              if id in line: #trying to find IDs from each line in those files
                 idname=open(id +'.txt', 'w') #opening a file with the ID name where all found results for that ID is stored
                 idname.append(line)
                 idnam.close()

我将非常感谢任何帮助,使用Awk,或任何Shell脚本或Python。 感谢

3 个答案:

答案 0 :(得分:2)

使用Bash你可以这样做:

while IFS= read -r i; do
  for f in file*.table; do
    grep "^$i " "$f" >> "${i}.txt"
  done
done < query.txt

甚至更好,因为你不需要知道这些线来自哪里:

while IFS= read -r i; do
  grep "^$i " file*.table >> "${i}.txt"
done < query.txt

答案 1 :(得分:0)

认为这应该适合你:

编辑:更正后的代码,因为它无效。现在功能齐全

  

说明:首先,我将所有CodeList加载到内部数组中,   然后,如果它们在代码列表中,我打印每个文件的行,   然后我将它们打印在以每个代码命名的文件上。

cat: awk: No such file or directory
$ ./awk.sh
GABDI004191
GABDI007217
GABDI004196
GABDI008080
$ cat query.txt
GABDI004191
GABDI007217
GABDI004196
GABDI008080
$ cat file1.table
GABDI004191 c23504_g1_i1    29.38   160 100 2   1   160 90  530
GABDI004191 c20415_g1_i1    45.21   73  39  1   180 252 27  242
GABDI004191 c17483_g1_i1    88.78   98  11  0   20  117 1   294
GABDI008080 c1407_g1_i1 95.56   45  2   0   112 156 200 66  9e-25
GABDI004196 c2892_g1_i1 35.44   79  50  1   37  115 237 4   7e-08
$ cat file2.table
GABDI007217 TR9707|c0_g1_i1 32.47   77  49  2   1   77  309 88
GABDI004196 TR9163|c0_g1_i1 63.77   69  25  0   315 383 207 1
GABDI007217 TR1165|c0_g1_i1 91.56   154 12  1   1   153 464 3
GABDI004191 TR4933|c0_g1_i1 91.56   154 12  1   1   153 35  496
GABDI008080 TR16029|c0_g1_i1    32.20   118 77  2   37  152 242
$ cat awk.sh
 awk  'BEGIN{
              while ((getline line < "query.txt" ) > 0)
              {codeList[line]=line
                print codeList[line]
                }
              close("query.txt" )
         }
        $1 in codeList { print $0 > $1".txt"}
'  file*.table
$ ./awk.sh
GABDI004191
GABDI007217
GABDI004196
GABDI008080
$ ls *txt
GABDI004191.txt  GABDI004196.txt  GABDI008080.txt  query.txt
$ cat GABDI004191.txt
GABDI004191 c23504_g1_i1    29.38   160 100 2   1   160 90  530
GABDI004191 c20415_g1_i1    45.21   73  39  1   180 252 27  242
GABDI004191 c17483_g1_i1    88.78   98  11  0   20  117 1   294
$

希望它有所帮助。

答案 2 :(得分:0)

awk 'NR==FNR{ids[$0];next} $1 in ids{print > ($1".txt")}' query.txt *.table

如果您收到有关同时打开太多文件的错误消息,请获取/使用GNU awk,因为它会在内部处理,否则如果证明不可能,则在{{1}之后添加close($1".txt") }。

shell是一个操作(例如创建/移动/销毁)文件和进程以及对工具进行调用的环境。用于操作文本的标准UNIX工具是awk,因此每当您需要在UNIX中操作文本时,您应该编写一个awk脚本并从shell中调用它。阅读Arnold Robbins撰写的“有效Awk编程”第4版。