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 -wne
executa o resto do comando para cada linha de entrada -
sub parseline { .... }
analisará a entrada e definirá o primeiro número na linha como$id
e 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@b
e, em seguida, a guia -
print "\n"
imprimirá nova linha no final - devido ao parâmetro
-n
paraperl
no início, todo o processo será reiniciado com a linha 3, depois com 5, depois com 7, etc. -
< input > output
indica 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 ...