Selecione linhas em um arquivo com base em valores específicos no segundo arquivo

0

Eu tenho dois arquivos:

Um é "total.txt". Tem duas colunas: a primeira coluna é números naturais (indicador) variando de 1 a 20, a segunda coluna contém números aleatórios.

1 321
1 423
1 2342
1 7542
2 789
2 809
2 5332
2 6762
2 8976
3 42
3 545
... ...
20 432
20 758

O outro é "index.txt". Tem quatro colunas: (1.indicador, 2: valor baixo, 3: valor alto, 4: nome da região)

1 400 5000 R1
2 600 800 R2
2 4000 8000 R3
11 300 4000 R4

Eu quero mostrar as linhas do arquivo "total.txt" com as primeiras correspondências de coluna com a primeira coluna do arquivo "index.txt". E, ao mesmo tempo, a segunda coluna de resultados de saída deve ser maior que (>) a segunda coluna do "index.txt" e menor que (<) a terceira coluna do "index.txt". E o nome da região também deve ser anexado.

O resultado esperado é o seguinte:

1 423 R1
1 2342 R1
2 809 R2
2 5332 R3
2 6762 R3
11 ... R4
11 ... R4

Eu tentei isso:

awk 'FNR == NR { low[$1]=$2; high[$1]=$3; reg[$1]=$4; next} 
     $2 >= low[$1] && $2 <= high[$1] {print $0,reg[$1]}' index.txt total.txt > result.txt

O resultado é apresentado da seguinte forma (com a região R2 em falta)

1 423 R1
1 2342 R1
2 5332 R3
2 6762 R3
11 ... R4
11 ... R4

Você pode me ajudar a explicar isso e me dizer como lidar com isso? Obrigada!

Na verdade, se os resultados puderem ser produzidos de acordo com regiões diferentes, é melhor, isso significa que, neste exemplo, é melhor produzir 4 arquivos de texto relacionados a regiões diferentes (R1.txt, R2.txt, R3.txt e R4. TXT). Obrigado!

    
por lightsnail 09.09.2016 / 20:52

1 resposta

3

Os indicadores nos dois arquivos de entrada (a primeira coluna) não são exclusivos, por isso é difícil usá-los como chaves. Mas se os IDs da região forem exclusivos, podemos usá-los:

 $ awk 'FNR == NR { reg=$4; low[reg]=$2; high[reg]=$3; ind[reg]=$1; next} 
  { for (reg in ind) { 
      if ($1 == ind[reg] && $2 >= low[reg] && $2 <= high[reg]) {
         print $0,reg
      } } }' index.txt total.txt
1 423 R1
1 2342 R1
2 789 R2
2 5332 R3
2 6762 R3

Este é basicamente o seu código, com o loop for incluído para mapear as regiões para seus indicadores e verificar quais das linhas no segundo arquivo correspondem.

(como para 2 789 R2 vs 2 809 R2 , não sei por que 809 deve ser impresso se os limites forem 600 e 800.)

Altere o comando de impressão para print $0,reg > reg ".txt" para obter a saída para arquivos nomeados pelas regiões.

    
por 09.09.2016 / 21:17

Tags