Shell 在两个不同结构的文本文件中查找匹配字符串

Shell 在两个不同结构的文本文件中查找匹配字符串,shell,Shell,我有一个以制表符分隔的文本文件,表示一个BLAST输出 Name1 BBBBBBBBBBBB 99.40 166 1 0 1 166 334 499 3e-82 302 Name2 DDDDDDDDDDDD 98.80 167 2 0 1 167 346 512 4e-81 298 一个文本文件B代表了一个系统发育树状图 "Cluster A": { "member": { "Cluster

我有一个以制表符分隔的文本文件,表示一个BLAST输出

Name1   BBBBBBBBBBBB    99.40   166 1   0   1   166 334 499 3e-82    302
Name2   DDDDDDDDDDDD    98.80   167 2   0   1   167 346 512 4e-81    298
一个文本文件B代表了一个系统发育树状图

"Cluster A": {
        "member": {
            "Cluster A": "BBBBBBBBBBBB This is Animal A", 
                   }, 
        "name": "Cluster A"
             }, 
    "Cluster B: {
        "member": {
            "Cluster B": "DDDDDDDDDDDD This is Animal B"
                   }, 
        "name": "cluster B"
                 }
我想以textfile A DDDD的第二个选项卡中的字符串为例,在文本文件B中查找该字符串。然后脚本应将textfile B中的信息添加到textfile A的新选项卡中:

Name1   BBBBBBBBBBBB    99.40   166 1   0   1   166 334 499 3e-82    302 Cluster A This is Animal A
Name2   DDDDDDDDDDDD    98.80   167 2   0   1   167 346 512 4e-81    298 Cluster B This is Animal B

多谢各位

一些从两个文件读取数据的示例代码 您的示例缺少外部{},这将导致解析失败,这就是代码添加它的原因

然后,它循环集群成员并构造所需的结果

import json                                                                 
import re                                                                   

with open("in1") as blast:                                                  
    blast_data = blast.readlines()                                             

with open("in2") as jsonfile:                                                  
    json_data = json.loads("{%s}" % jsonfile.read())                           

for bdata in blast_data:                                                       
    id = bdata.split()[1]                                                      
    for cluster in json_data:                                                  
        for member in json_data[cluster]['member']:                            
            if id in json_data[cluster]['member'][member]:                     
                print "%s %s %s" % (bdata.strip(), member, re.sub(id, '', json_data[cluster]['member'][member]))
                break

修复json文件:

$ cat B
[
    { "Cluster A": { "member": { "Cluster A": "BBBBBBBBBBBB This is Animal A" }, "name": "Cluster A" } }, 
    { "Cluster B": { "member": { "Cluster B": "DDDDDDDDDDDD This is Animal B" }, "name": "cluster B" } }
]
然后,一个perl解决方案:

perl -MJSON -MPath::Class -E '
    my $data = decode_json file("B")->slurp;
    $, = "\t";
    for my $line (file("A")->slurp(chomp => 1)) {
        my @F = split /\t/, $line;
        for my $item (@$data) {
            for my $cluster (keys %$item) {
                while (my ($key, $value) = each %{$item->{$cluster}{member}} ) {
                    if ($value =~ /$F[1]\s+(.*)/) {
                        say $line, $cluster, $1;
                    }
                }
            }
        }
    }
'
输出

Name1   BBBBBBBBBBBB    99.40   166 1   0   1   166 334 499 3e-82   302 Cluster A   This is Animal A
Name2   DDDDDDDDDDDD    98.80   167 2   0   1   167 346 512 4e-81   298 Cluster B   This is Animal B
对于kicks,等效的Ruby

ruby -rjson -e '
  data = JSON.load File.new("B")
  File.readlines("A").each {|line|
    line.chomp!
    f = line.split("\t")
    data.each {|obj|
      obj.each_key {|cluster|
        obj[cluster]["member"].each_pair {|key, value| 
          if m = value.match(f[1] + "\s+(.*)")
            puts [line, cluster, m[1]].join("\t")
          end
        }
      }
    }
  }
'

Shell脚本的一段代码

#!/usr/bin/ksh
awk '{print $2}' file1 > tmpfile
for i in `cat tmpfile`
do
{
aa=`grep -w $i file2`
awk -v out="$aa" -v pattern="$i" ' $2 ~ pattern { print $0"   "out}' file1}
done
awk“{print$2}”file1>tmpfile-从第一个文件获取模式并存储在tmp文件中 aa=grep-w$i file2-匹配文件2中的类似模式,并将整行存储在变量aa中
awk-v out=$aa-v pattern=$i'$2~pattern{print$0 out}'file1}-将file2中的字符串附加到file1的相应匹配行中

不确定这是否只是c&p错误,但第二个应该是json,并且充满语法错误吗?在这种情况下,你可以尝试把它分解成一个DICT,这使得访问和比较很多EasiReIT确实是一个JSON,但是我以前从来没有使用过这种格式。在这种情况下,看看一些基础知识,你会得到一个DICT,它可以让你轻松地访问成员字段。一个简单的方法是从BLAST输出中剪切出所需的字符串,并在集群中搜索它。*字段应该完成这个任务JSON格式不会增加任何值。使用简单的制表符分隔的文件会更容易。@glennjackman问题是,第二个输入已经是json。MJSON是perl的额外模块吗?“[-M[-]”模块…”]应该导入模块,如果您使用[-e |-e]'command']运行命令是的,json和Path::Class是可以从cpan.orgFile blast.py安装的附加模块,第8行,在json_data=json.loads{%s}%jsonfile.read文件/opt/qiime-1.8.0/python-2.7.3-release/lib/python2.7/json/_u init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py,第326行,在loads返回u default_uuuudecoder.decoder.decoder文件/opt/qiime-1.8.0/python-2.7.3-3-3-releas,0.end File/opt/qiime-1.8.0/python-2.7.3-release/lib/python2.7/json/decoder.py,第382行,在raw_decode obj中,end=self.scan_onces,idx ValueError:需要属性名称:第1行第1列char 1个字符,python有什么错误?它嵌入到另一个软件套件中,我宁愿认为输入文件的格式被破坏,可能是与代码结合在一起。您能否验证它的解析是否正确,或者向我显示完整的示例输出?