Como atribuir variáveis associadas à lista de intervalos para outra tabela com números inteiros

0

Eu tenho uma lista de inteiros de 1 a 6k, e eu tenho uma lista de intervalos (start / stop) com um terceiro valor que gostaria de atribuir a cada número inteiro dentro desses intervalos. A lista de intervalos pode se parecer com isso, embora, na verdade, eu tenha centenas de faixas exclusivas por arquivo para checar cada número inteiro.

5277 5305 72

5306 5331 50

5332 5361 57

5368 5389 55

O que eu gostaria de fazer é imprimir o inteiro e o valor da terceira coluna da tabela de intervalos, ou imprimir um "0" para números inteiros que não caiam em nenhum intervalo.

1 0

2 0

3 0

...

5277 72

5278 72

5279 72

...

5305 72

5306 50

5307 50

...

6000 0

Alguma ideia de como obter os resultados pretendidos? Eu estava pensando em escrever 'for' loops para números inteiros 1-6000 com arquivos 'if' incorporados para verificar cada número inteiro em cada intervalo, mas não quero escrever centenas individualmente de instruções 'if', apenas para alterá-las para o próximo conjunto de dados. Talvez isso possa ser feito criando uma tabela de intervalos no MySQL e verificando cada um dos 6000 valores contra a tabela e imprimindo o resultado, mas eu não estou tão familiarizado com o MySQL, então levaria muito mais tempo para descobrir.

    
por user166420 19.04.2016 / 03:08

1 resposta

1

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:

  1. 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)

  2. 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.

    
por 19.04.2016 / 04:10