Q:

Como agrupar arquivo texto de acordo com parâmetros da primeiro linha em C#

Consegui juntar diversos arquivos texto de um mesmo diretório em um arquivo texto final, agrupando os códigos iguais e somando as suas respectivas quantidades, utilizando o seguinte código (créditos ao amigo Vitor Mendes):
Dictionary<string, int> valores = new Dictionary<string, int>();

string diretorio = @"C:\teste";

string[] listaDeArquivos = Directory.GetFiles(diretorio);

if (listaDeArquivos.Length > 0)
{
    string caminhoArquivoDestino = @"C:\teste\saida.txt";

    FileStream arquivoDestino = File.Open(caminhoArquivoDestino, FileMode.OpenOrCreate);

    arquivoDestino.Close();

    List<string> linhasDestino = new List<string>();

    foreach (string caminhoArquivo in listaDeArquivos)
    {
         foreach (var linhaArquivoAtual in File.ReadAllLines(caminhoArquivo))
         {
            string id = linhaArquivoAtual.Substring(0, linhaArquivoAtual.Length - 3);
            string quantidade = linhaArquivoAtual.Substring(linhaArquivoAtual.Length - 3, 3);

            if (valores.ContainsKey(id)) 
            valores[id] = valores[id] + Convert.ToInt32(quantidade);
            else
            valores.Add(id, Convert.ToInt32(quantidade));           

         }
    }

    File.WriteAllLines(caminhoArquivoDestino, valores.Select(x => x.Key + x.Valeu.ToString("000")).ToArray());
}

A primeira linha de casa arquivo texto contem 2 parâmetros de identificação separados por ponto. Vou exemplificar:
Conteúdo do Arq1.txt
000032;30032014
123456010
654321020

Conteúdo do Arq2.txt
000032;30032014
123456005
654321005

Conteúdo do Arq3.txt
000033;23052014
123456050
654321020

Conteúdo do Arq4.txt
000033;23052014
123456020
654321005

Conteúdo do Arq5.txt
000033;20052014
123456001
654321002

Conteúdo do Arq6.txt
000033;20052014
123456009
654321008

Ao agrupar esses arquivos, o programa deverá gerar diferentes arquivos finais de acordo com os parâmetros da primeira linha. Nesses exemplos de arquivos, o resultado final serão os seguintes arquivos:
ArqFinal00003320052014.txt
123456010
654321010

ArqFinal00003323052014.txt
123456070
654321025

ArqFinal00003230032014.txt
123456015
654321025

Ou seja, o programa deverá agrupar os arquivos de acordo com a primeira linha, criando arquivos finais diferentes.

A:

Conforme exemplo nesta resposta, um dicionário é a solução para agrupar itens. No caso agora você tem dois níveis de agrupamento, então o uso de dicionários aninhados se faz necessário. Você tem o dicionário com os nomes dos arquivos como chave e o valor é um outro dicionário com códigos como chave e as quantidades como valor.
O código está longe de estar ótimo mas ele está testado e faz o que você deseja.
Os comentários foram colocados para fins didáticos e não exprime a maneira como eu comento códigos.
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;

public class MergeFiles {
    public static void Main(string[] args) {
        var itens = new Dictionary<string, Dictionary<string, int>>(); //Cria a estrutura que permite chaves únicas do tipo string e valores associados do tipo int
        int resultado;
        foreach (var arquivo in Directory.GetFiles(@"C:\teste", "*.txt")) { //Pega todos os arquivos com extensão txt disponíveis no diretório
            var chaveArquivo = "";
            foreach (var linha in File.ReadAllLines(arquivo)){ //Lê todas as linhas individualmente de cada arquivo
                if (linha.Substring(6, 1)  == ";") { //Verifica se esta é a primeira linha
                   chaveArquivo = linha.Substring(0, 6) + linha.Substring(7, 8); //Pega os 6 primeiros caracteres e os 8 sequintes pulando o ;
                    if (!itens.ContainsKey(chaveArquivo)) { //verifica se não existe a chave com nome do arquivo
                        itens.Add(chaveArquivo, new Dictionary<string, int>()); //Adiciona uma nova chave ainda inexistente no dicionário
                    }
                } else {
                    var chave = linha.Substring(0, 6); //Pega os 6 primeiros caracteres
                    var valor = (int.TryParse(linha.Substring(6, 3), out resultado) ? resultado : 0); //Pega os 3 caracteres seguintes e converte para numérico
                    if (itens[chaveArquivo].ContainsKey(chave)) { //verifica se já existe a chave no dicionário
                        itens[chaveArquivo][chave] = itens[chaveArquivo][chave] + valor; //adiciona o valor obtido na linha à chave já existe no dicionário
                    } else {
                        itens[chaveArquivo].Add(chave, valor); //Adiciona uma nova chave ainda inexistente no dicionário
                    }
                }
            }
        }
        //Cria os arquivos agrupados adicionando todas as linhas do dicionário recriando a mesma estrutura anterior através do LINQ
        foreach(var arquivo in itens) {
            File.WriteAllLines(arquivo.Key + ".txt", arquivo.Value.Select(item => item.Key + item.Value.ToString("000")).ToArray());
        }
    }
}

Coloquei no GitHub para referência futura.

