我有几个看起来像这样的数据文件:
HR0
012312010
001230202
HR1
012031020
012320102
012323222
012321010
HR2
321020202
...
解释:有一条线定义了字段(HR" n"),可变数量的带有四进制数字的行(321020202),然后是两个字段之间的额外换行符。我想组合等效的HR字段。所以从某种意义上说,我想将这些文件拉链成一个大文件。我认为使用sed是答案,但我不知道从哪里开始。
我正在考虑在python或c ++程序上使用shell脚本,因为我觉得它在编写和执行方面可能更快。想法?
答案 0 :(得分:1)
在C ++中这很容易做到,如果你有C ++ 17,那就更好了。
您可以编写一个函数来读取multimap<int, int>
之类的内容:
multimap<int, int> read(istream& input) {
multimap<int, int> output;
string i;
while(input >> i) {
const auto key = std::atoi(data(i) + 2);
transform(istream_iterator<int>(input), istream_iterator<int>(), inserter(output, begin(output)), [key](const auto value){ return make_pair(key, value); });
input.clear();
}
return output;
}
因此,您可以使用每个文件ifstream
调用该函数,并使用merge
将返回值转储到您的累积multimap<int, int> output
。
然后你只需将output
转储到你的输出文件中,说它已经用ofstream filep
打开了你可以像这样转储:
auto key = cbegin(output)->first;
filep << key << ":\n" << setfill('0');
for(const auto& it : output) {
if(it.first == key) {
filep << '\t' << setw(9) << it.second << endl;
} else {
key = it.first;
filep << key << ":\n\t" << setw(9) << it.second << endl;
}
}
我在这里写了一个只涉及一个文件的实例:http://ideone.com/n47MnS