我有一个如下所示的txt文件。作为一个例子,它有6行。每个raw都有一个字符串或多个字符串。例如,第一行只有一个字符串,但第二行有两个字符串(用逗号分隔)。我还把行数放到了示例中
1 P41182
2 P41152,Q9UQL6
3 P41172
4 Q92793,Q09472,Q9Y6Q9
5 Q15021,TQ9472
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
我有另一个文字,如下所示。结构相同。例如,第一行只有一个字符串,但第二行有两个
1 P41182
2 P41152,Q9UYIU
3 P41172
4 Q9IO93,Q9Y6IT
5 P30561
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
7 HT8971
8 HLI872
我想知道第二个数据中与第一个数据类似的某些字符串的索引。有如下角色:
如果第一个txt中只有1个字符串并且与第二个txt匹配,我不想知道索引。如果第一个txt中有多个字符串,其中一个他们或其中一些类似于第二个txt文件,然后我想知道它们的索引,例如输出应该如下所示
DF3
1 P41182
2 P41152_2_1,Q9UYIU
3 P41172
4 Q9IO93,Q9Y6IT
5 P30561
6 Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5
7 HT8971
8 HLI872
第一个第二个数据字符串类似于只包含1个成员的第一个数据字符串(每个元素中的字符串用逗号分隔)所以我保持原样并且我不想要索引。
第二个txt文件中的第二个字符串类似于第一个txt文件中该行的第二行和第一个字符串,因此它得到2_1
第二个txt中的第六个字符串类似于第一个txt的第五行和第一个字符串,它也类似于第一个txt文件的第六行和第一个字符串,因此它得到5_1和6_1
等等。答案 0 :(得分:2)
我假设数据可以用字符串数组表示。
arr1 = ["P41182", "P41152,Q9UQL6", "P41172", "Q92793,Q09472,Q9Y6Q9",
"Q15021,TQ9472", "Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3"]
arr2 = ["P41182", "P41152,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
"Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3", "HT8971", "HLI872"]
h = arr1.each.with_index(1).with_object({}) do |(s1,i),h|
next unless s1.include?(',')
s1.split(',').each.with_index(1) { |s2,j| (h[s2] ||= '') << "_#{i}_#{j}" }
end
#=> {"P41152"=>"_2_1", "Q9UQL6"=>"_2_2", "Q92793"=>"_4_1", "Q09472"=>"_4_2",
# "Q9Y6Q9"=>"_4_3", "Q15021"=>"_5_1_6_1", "TQ9472"=>"_5_2", "Q9BPX3"=>"_6_2",
# "Q15003"=>"_6_3", "O95347"=>"_6_4", "Q9NTJ3"=>"_6_5"}
arr2.map {|s1| s1.split(',').map { |s2| h.key?(s2) ? "%s%s" % [s2, h[s2]] : s2 }.join(',')}
#=> ["P41182", "P41152_2_1,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
# "Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5", "HT8971", "HLI872"]
答案 1 :(得分:2)
我想以下ruby代码应该有效: 确保以逗号分隔df1.txt和df2.txt。您将在df3.txt中输出。请参阅下面的示例txt文件。
df1_hash = {}
df1_term_positions_hash = Hash.new([])
File.readlines("df1.txt").each_with_index do |line, i|
df1_hash[i+1] = line.strip.split(",")
for x in line.strip.split(",")
df1_term_positions_hash[x] += [i+1]
end
end
df2_hash = {}
File.readlines("df2.txt").each_with_index do |line, i|
df2_hash[i+1] = line.strip.split(",")
end
df2_size = df2_hash.size
df3_hash = {}
for i in (1..df2_size)
df3_hash[i] = df2_hash[i].each_with_index.map do |term, intermediate_index|
number_of_repetitions = df1_term_positions_hash[term].size
updated_term = term.dup
df1_term_positions_hash[term].each_with_index do |repetition_position, index|
if (df1_hash[repetition_position].size <= 1 rescue true )
updated_term = term
else
additional_tail = "#{repetition_position}_#{df1_hash[repetition_position].index(term)+1}"
updated_term = updated_term + "_" + additional_tail
end
end
updated_term
end
end
File.open("df3.txt", "w") do |file|
for i in (1..df2_size)
file.puts df3_hash[i].join(",")
end
end
P41182
P41152,Q9UQL6
P41172
Q92793,Q09472,Q9Y6Q9
Q15021,TQ9472
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
P41182
P41152,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
HT8971
HLI872
P41182
P41152_2_1,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5
HT8971
HLI872
抱歉小杂乱的代码,但它的工作原理。
希望它有所帮助:)