Shell 在两个不同结构的文本文件中查找匹配字符串
我有一个以制表符分隔的文本文件,表示一个BLAST输出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
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有什么错误?它嵌入到另一个软件套件中,我宁愿认为输入文件的格式被破坏,可能是与代码结合在一起。您能否验证它的解析是否正确,或者向我显示完整的示例输出?