Eu usaria o perl e o executaria como oneliner assim:
perl -wne 'sub parseline { ($id,$v) = split; return split //,$v };
@a = parseline();
print "$id\t";
$_ = <>;
@b = parseline();
for ($i=0; $i<@a; $i++) {
print "$a[$i] $b[$i]\t"
};
print "\n"' < input > output
Explicação:
-
perl -wneexecuta o resto do comando para cada linha de entrada -
sub parseline { .... }analisará a entrada e definirá o primeiro número na linha como$ide retornará o restante como matriz de caracteres. -
@a=parseline()armazenará os caracteres de primeira linha na matriz @a - em seguida, imprimimos
$id, seguido por TAB (\t) -
$_=<>; @b=parseline();lerá a linha seguinte (par) e colocará os dados no array@b -
for ($i=0; $i<@a; $i++) { print "$a[$i] $b[$i]\t" }para cada elemento da matriz@a, imprimiremos esse elemento, dois espaços, elemento correspondente da matriz@be, em seguida, a guia -
print "\n"imprimirá nova linha no final - devido ao parâmetro
-nparaperlno início, todo o processo será reiniciado com a linha 3, depois com 5, depois com 7, etc. -
< input > outputindica a partir de qual arquivo lemos nossa entrada e em qual arquivo gravamos a saída.
Observação: o código imprimirá uma guia extra no final de cada linha. A remoção é deixada como um exercício para o leitor evitar tarefas de tarefas de crowdsourcing e manter o código pouco mais simples. Além disso, o código assume que as linhas a serem pareadas são sempre duas e uma após a outra (conforme fornecido no exemplo)
À medida que processa o arquivo de entrada linha por linha, ele pode ser facilmente dimensionado linearmente para muitos milhares de linhas ...