Mejor solución para encontrar grupos de identificación (permutaciones / combinaciones)

Mi objective para esta pregunta es encontrar una solución más eficiente para realizar una tarea.

Tengo un file que contiene filas de ID, por ejemplo:

1001 1004 1005 1010 1006 1020 1002 1002 1005 1006 1001 1010 1020 1043 1009 1016 1011 1012 1013 1010 1020 1030 1050 1004 1014 1001 1008 1004 1021 1022 1010 1001 1004 1010 

etc.

(* Hay más de 500,000 filas)

De esta list, he creado permutaciones de todas las posibles combinaciones de 2 ID, 3 ID, 4 ID, 5 ID y 6 ID. De las 500K filas, se crearon más de 50 millones de combinaciones de 2, 3, 4, 5 y 6 ID.

El objective es averiguar con qué frecuencia las identificaciones se producen juntas. Por ejemplo, con qué frecuencia 1001, 1004 y 1010 ocurren juntos. O con qué frecuencia se producen juntos 1010, 1020, 1030, 1040, etc. Básicamente, con qué frecuencia se producen juntas cada combinación de 2 ID, 3 ID, 4 ID, 5 ID y 6 ID.

Escribí un script Bash (que funciona) pero ha estado funcionando durante 3 días y me he dado count de que no está cerca de hacerse.

Mi guión actual está leyendo cada línea en mi file de permutaciones (50 millones de loggings) y para cada logging está leyendo cuántos identificadores hay en la permutación y luego usa awk:

(para un combo de 3 ID):

 awk '/'$id1'/ && /'$id2'/ && /'$id3'/' $filename 

(para un combo de 4 ID):

 awk '/'$id1'/ && /'$id2'/ && /'$id3'/' && /'$id4'/' $filename 

… e iterando a través de las 50 millones de combinaciones. Está funcionando a aproximadamente 2-3 combos por segundo, pero las matemáticas simples me dicen que debería tomar más de 200 días.

¿Alguien puede sugerir una solución más eficiente?

Esto va más a la progtwigción, pero abordaría esto leyendo el file línea por línea, formando las combinaciones que están presentes en cada línea, contando sus apariencias en una tabla hash.

La parte sobre cómo formar las combinaciones es algo para lo que querrás usar una biblioteca.

Perl al rescate, Algorithm :: Combinatorics tiene una function list para enumerar las combinaciones. Según los ejemplos, algo como esto parece bastante fácil de hacer. Esto solo count combinaciones de dos, siéntete libre de mejorarlo.

 perl -MAlgorithm::Combinatorics=combinations -lane ' $i = combinations([sort @F], 2); while ($x = $i->next) { $count{join "-", @$x}++ } END {printf "%s: %d\n", $_, $count{$_} foreach keys %count } ' < ids > counts | sort -nk2 | tail -3 1010-1020: 3 1001-1010: 4 1004-1010: 4 

Supuse que el order de los numbers en cada línea no importaba, así que clasifiqué la input. (Creo que las combinations mantienen el order de los elementos, por lo que el resultado no tiene duplicates sin clasificar.) Con los numbers de ejemplo obtuve algo así como 30000 líneas procesadas por segundo.