连接多个数据文件

时间:2016-10-21 13:43:04

标签: python c++ shell sed text-files

我有几个看起来像这样的数据文件:

HR0
012312010
001230202

HR1
012031020
012320102
012323222
012321010

HR2
321020202
...

解释:有一条线定义了字段(HR" n"),可变数量的带有四进制数字的行(321020202),然后是两个字段之间的额外换行符。我想组合等效的HR字段。所以从某种意义上说,我想将这些文件拉链成一个大文件。我认为使用sed是答案,但我不知道从哪里开始。

我正在考虑在python或c ++程序上使用shell脚本,因为我觉得它在编写和执行方面可能更快。想法?

1 个答案:

答案 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