Isso vai mais para programação, mas eu abordaria isso lendo o arquivo linha por linha, formando as combinações que estão presentes em cada linha, contando suas aparências em uma tabela de hash.
A parte sobre a formação das combinações é algo que você vai querer usar uma biblioteca para.
Perl para o resgate, Algorithm :: Combinatorics tem um ready-made função para listar as combinações. Com base nos exemplos, algo assim parece muito fácil de fazer. Isso só conta combinações de dois, sinta-se livre para melhorá-lo.
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
Eu assumi que a ordem dos números em cada linha não importava, então eu classifiquei a entrada. (Eu acho que combinations
mantém a ordem dos elementos, então o resultado não tem duplicatas não classificadas).
Com os números de exemplo, obtive algo como 30000 linhas processadas por segundo.