Isso é um pouco confuso, mas pelo menos evita o uso de SQL. Usando seu intervalo de amostra no arquivo chamado 'range':
seq 6000 > integers
awk '{print $1","$2"{s/\(.*\)/\1 "$3"/; t\n}" } END { print "s/\(.*\)/\1 0/" }' range > range.sed
sed -f range.sed integers > integers.output
Isso cria o arquivo inteiro com os números 1..6000 e, em seguida, usa o awk para converter o arquivo de intervalo em uma série de comandos sed
, que são todos redirecionados para um arquivo de script sed (range.sed). Em seguida, chamamos sed com esse arquivo de script sed na entrada de inteiros e o redirecionamos para um arquivo de saída.
O script awk está fazendo duas coisas básicas:
-
Imprimindo um intervalo "iniciar, parar" (usando o primeiro e o segundo campos do arquivo de intervalo) com um bloco de dois comandos:
a. imprimir uma pesquisa sed & Substitua o comando "qualquer coisa na linha" por "qualquer coisa anterior" seguido pela terceira coluna do arquivo de intervalo.
b. Se a substituição foi bem sucedida, ramifique-se para o final do script sed (e assim ignorando a última parte do script sed)
-
como o último comando no script sed (depois de Encerrar toda a entrada do intervalo), imprima uma pesquisa sed & substitua o comando para substituir qualquer valor na linha por esse valor seguido por um zero.
Isso deixa você bastante flexível em poder atualizar o intervalo e / ou arquivos inteiros conforme necessário, sem ter que atualizar muita lógica codificada.