#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <map>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
using namespace std;
int main(int argc, char * argv[]){
ifstream readR1file(argv[1]);
ifstream readR2file(argv[2]);
typedef map<string, string> mapType;
mapType R1_SEQ_MAP;
mapType R2_SEQ_MAP;
string str="", key="", tmp_value="", value="";
int r1_line_cnt = 0;
while(getline(readR1file, str, '\n'))
{
if(r1_line_cnt<40000){
r1_line_cnt++;
vector<string> id_str;
if(r1_line_cnt%4==1){
value = "";
boost::split(id_str,str,boost::is_any_of("/"));
key = id_str[0];
}else{
tmp_value = "";
tmp_value = str + "\n";
value += tmp_value;
}
if(r1_line_cnt%4==0){
R1_SEQ_MAP.insert(map<string, string>::value_type (key, value));
}
}
}
readR1file.close();
str="", key="", tmp_value="", value="";
int r2_line_cnt = 0;
while(getline(readR2file, str, '\n'))
{
r2_line_cnt++;
vector<string> id_str;
if(r2_line_cnt%4==1){
value = "";
boost::split(id_str,str,boost::is_any_of("/"));
key = id_str[0];
}else{
tmp_value = "";
tmp_value = str + "\n";
value += tmp_value;
}
if(r2_line_cnt%4==0){
R2_SEQ_MAP.insert(map<string, string>::value_type (key, value));
}
}
readR2file.close();
ofstream writeR1file(argv[3]);
ofstream writeR2file(argv[4]);
//find
map<string,string>::iterator iter = R1_SEQ_MAP.begin();
for (iter=R1_SEQ_MAP.begin(); iter!=R1_SEQ_MAP.end(); ++iter){
string find_key = iter->first;
string r1_key = find_key + "/1";
string r2_key = find_key + "/2";
if(R2_SEQ_MAP.find(find_key) == R2_SEQ_MAP.end()){
// not found
}else{
// found
writeR1file << r1_key << "\n" << iter->second;
writeR2file << r2_key << "\n" << R2_SEQ_MAP.find(find_key)->second;
}
}
writeR2file.close();
writeR2file.close();
R1_SEQ_MAP.clear();
R2_SEQ_MAP.clear();
/*
map<string,string>::iterator it = R2_SEQ_MAP.begin();
for (it=R2_SEQ_MAP.begin(); it!=R2_SEQ_MAP.end(); ++it)
cout << it->first << " => " << it->second << '\n';
*/
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAgICAKI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPiAgIAojaW5jbHVkZSA8dmVjdG9yPiAgICAgICAKI2luY2x1ZGUgPG1hcD4gICAgICAgCiNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nL2NsYXNzaWZpY2F0aW9uLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcvc3BsaXQuaHBwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKXsKICAgIAoJaWZzdHJlYW0gcmVhZFIxZmlsZShhcmd2WzFdKTsgCglpZnN0cmVhbSByZWFkUjJmaWxlKGFyZ3ZbMl0pOyAKCQoJdHlwZWRlZiBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcFR5cGU7CiAgICBtYXBUeXBlIFIxX1NFUV9NQVA7CiAgICBtYXBUeXBlIFIyX1NFUV9NQVA7CgoJc3RyaW5nIHN0cj0iIiwga2V5PSIiLCB0bXBfdmFsdWU9IiIsIHZhbHVlPSIiOwoJaW50IHIxX2xpbmVfY250ID0gMDsKCXdoaWxlKGdldGxpbmUocmVhZFIxZmlsZSwgc3RyLCAnXG4nKSkKCXsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgaWYocjFfbGluZV9jbnQ8NDAwMDApewoJCQlyMV9saW5lX2NudCsrOwoJCQl2ZWN0b3I8c3RyaW5nPiBpZF9zdHI7CgkJCWlmKHIxX2xpbmVfY250JTQ9PTEpewkKCQkJCXZhbHVlID0gIiI7CgkJCQlib29zdDo6c3BsaXQoaWRfc3RyLHN0cixib29zdDo6aXNfYW55X29mKCIvIikpOwoJCQkJa2V5ID0gaWRfc3RyWzBdOwoJCQl9ZWxzZXsKCQkJCXRtcF92YWx1ZSA9ICIiOwoJCQkJdG1wX3ZhbHVlID0gc3RyICsgIlxuIjsKCQkJCXZhbHVlICs9IHRtcF92YWx1ZTsKCQkJfQoJCQlpZihyMV9saW5lX2NudCU0PT0wKXsJCQkKCQkJCVIxX1NFUV9NQVAuaW5zZXJ0KG1hcDxzdHJpbmcsIHN0cmluZz46OnZhbHVlX3R5cGUgKGtleSwgdmFsdWUpKTsKCQkJfQoJCX0KICAgIH0gICAgCglyZWFkUjFmaWxlLmNsb3NlKCk7CgkKCXN0cj0iIiwga2V5PSIiLCB0bXBfdmFsdWU9IiIsIHZhbHVlPSIiOwoJaW50IHIyX2xpbmVfY250ID0gMDsKCXdoaWxlKGdldGxpbmUocmVhZFIyZmlsZSwgc3RyLCAnXG4nKSkKCXsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgcjJfbGluZV9jbnQrKzsKCQl2ZWN0b3I8c3RyaW5nPiBpZF9zdHI7CgkJaWYocjJfbGluZV9jbnQlND09MSl7CQoJCQl2YWx1ZSA9ICIiOwoJCQlib29zdDo6c3BsaXQoaWRfc3RyLHN0cixib29zdDo6aXNfYW55X29mKCIvIikpOwoJCQlrZXkgPSBpZF9zdHJbMF07CgkJfWVsc2V7CgkJCXRtcF92YWx1ZSA9ICIiOwoJCQl0bXBfdmFsdWUgPSBzdHIgKyAiXG4iOwoJCQl2YWx1ZSArPSB0bXBfdmFsdWU7CgkJfQoJCWlmKHIyX2xpbmVfY250JTQ9PTApewkKCQkJUjJfU0VRX01BUC5pbnNlcnQobWFwPHN0cmluZywgc3RyaW5nPjo6dmFsdWVfdHlwZSAoa2V5LCB2YWx1ZSkpOwoJCX0KICAgIH0gICAgCglyZWFkUjJmaWxlLmNsb3NlKCk7CgkKCW9mc3RyZWFtIHdyaXRlUjFmaWxlKGFyZ3ZbM10pOwoJb2ZzdHJlYW0gd3JpdGVSMmZpbGUoYXJndls0XSk7CgoJLy9maW5kCgltYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBSMV9TRVFfTUFQLmJlZ2luKCk7Cglmb3IgKGl0ZXI9UjFfU0VRX01BUC5iZWdpbigpOyBpdGVyIT1SMV9TRVFfTUFQLmVuZCgpOyArK2l0ZXIpewoJCXN0cmluZyBmaW5kX2tleSA9IGl0ZXItPmZpcnN0OwoJCXN0cmluZyByMV9rZXkgPSBmaW5kX2tleSArICIvMSI7CgkJc3RyaW5nIHIyX2tleSA9IGZpbmRfa2V5ICsgIi8yIjsKCQlpZihSMl9TRVFfTUFQLmZpbmQoZmluZF9rZXkpID09IFIyX1NFUV9NQVAuZW5kKCkpewoJCQkvLyBub3QgZm91bmQKCQl9ZWxzZXsKCQkJLy8gZm91bmQJCQkKCQkJd3JpdGVSMWZpbGUgPDwgcjFfa2V5IDw8ICJcbiIgPDwgaXRlci0+c2Vjb25kOwoJCQl3cml0ZVIyZmlsZSA8PCByMl9rZXkgPDwgIlxuIiA8PCBSMl9TRVFfTUFQLmZpbmQoZmluZF9rZXkpLT5zZWNvbmQ7CgkJfQoJfQoJd3JpdGVSMmZpbGUuY2xvc2UoKTsgICAKCXdyaXRlUjJmaWxlLmNsb3NlKCk7ICAgICAKCiAgICBSMV9TRVFfTUFQLmNsZWFyKCk7CiAgICBSMl9TRVFfTUFQLmNsZWFyKCk7Ci8qCQoJbWFwPHN0cmluZyxzdHJpbmc+OjppdGVyYXRvciBpdCA9IFIyX1NFUV9NQVAuYmVnaW4oKTsKCWZvciAoaXQ9UjJfU0VRX01BUC5iZWdpbigpOyBpdCE9UjJfU0VRX01BUC5lbmQoKTsgKytpdCkKCQljb3V0IDw8IGl0LT5maXJzdCA8PCAiID0+ICIgPDwgaXQtPnNlY29uZCA8PCAnXG4nOwoqLwogIHJldHVybiAwOwp9