AWK Usando uma Variável em uma Expressão de Igualdade

0

Uma versão simplificada do meu código se parece com o seguinte:

declare -a DMN=(" " "200" "190" "180")
NRL=3

runDHFiles()
{
awk 'NR>13 {if ($4==$DMN[$i]) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat
}

for ((i = 1; i <= NRL; i++ )); do
   runDHFiles
done

Estou tentando fazer um loop em um arquivo grande do Excel e copiar as linhas em que o sinalizador de domínio (na coluna 4) é igual a um determinado número.

Se eu fizer isso, tudo funcionará bem:

if ($4==200)

Se eu fizer isso, não funciona:

if ($4==$DMN[$i])

Como posso acessar o valor da matriz no meu loop para a instrução de igualdade?

Obrigado,

Cole

    
por user115657 01.12.2015 / 23:56

2 respostas

1

Uma opção é passar a variável do shell para awk , o que evita a recitação:

awk 'NR>13 {if ($4==dmn) print $1, $2, $3, $4;}' dmn="${DMN[$i]}" domain_all.dat >> ddh_domain_${DMN[$i]}.dat

Eu estaria inclinado a refatorar seu script de shell também, para que a variável fosse passada para a função do shell:

declare -a DMN=(" " "200" "190" "180")
NRL=3

runDHFiles()
{
    local dmn="$1"
    awk 'NR>13 && $4==dmn {print $1, $2, $3, $4;}' dmn="$dmn" domain_all.dat >> "ddh_domain_${dmn}.dat"
}

for ((i=1; i<=NRL; i++ ))
do
   runDHFiles "${DMN[$i]}"
done
    
por 02.12.2015 / 00:13
0

Se você alterar sua cotação para permitir que a variável bash array seja "vista", isso melhoraria:

awk 'NR>13 {if ($4=="'"$DMN[$i]"'") print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat

Ou seja, termine temporariamente a parte com aspas simples (e use aspas duplas para torná-la uma string para awk ).

Como alternativa (alguns preferem), seria usar a opção -v de awk para declarar uma variável e usar essa no script:

awk -v value=DMN[$i] 'NR>13 {if ($4==value) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat
    
por 02.12.2015 / 00:05