Looping sobre variáveis dentro de um comando awk

0

Eu tenho um arquivo de texto "Hessian_h2o_2z.log" contendo o seguinte:

            GX1        GY1        GZ1        GX2        GY2         GZ2        GX3        GY3        GZ3
GX1  0.5915206
GY1  0.0139938  0.0135051
GZ1 -0.0876734 -0.0846119  0.5301078
GX2 -0.5223003 -0.0025088  0.0157183  0.5399848
GY2  0.0078178 -0.0011236  0.0070395  0.0007403  0.0012737
GZ2 -0.0489795  0.0070395 -0.0441035 -0.0046382 -0.0079797  0.0499940
GX3 -0.0692203 -0.0114850  0.0719552 -0.0176845 -0.0085581  0.0536178  0.0869048
GY3 -0.0218115 -0.0123815  0.0775724  0.0017685 -0.0001501  0.0009402  0.0200430  0.0125316
GZ3  0.1366530  0.0775724 -0.4860043 -0.0110801  0.0009402 -0.0058905 -0.1255729 -0.0785126  0.4918948

Eu estou tentando atribuir sequencialmente cada valor na primeira coluna de números (coluna 2 no arquivo) a uma variável X, é o que eu tenho até agora:

a=1
b=1
a=$((a+1))
b=$((b+1))
X='awk -v A=$a -v B=$b 'NR == A {print $B}' Hessian_h2o_2z.log'
Y='awk -v A=$a -v B=$b 'NR == A {print $B}' Hessian_h2o_3z.log'

for var in $X
do
echo $var
done

no entanto, isso está apenas produzindo a saída:

0.5915206

Alguém pode explicar por que o loop não continua após NR == 2 e coluna 2?

N.B. relativamente novo para scripts de shell, então qualquer ajuda com o script sendo desnecessariamente longo para o que eu estou tentando alcançar seria apreciada.

    
por Stephen Mason 14.12.2016 / 19:55

1 resposta

0

Eu acho que sua abordagem original é falha. Você pode fazer isso em shell puro (para quantidades pequenas (ish) de dados (limpos)).

Algo ao longo destas linhas pode fazer o truque para você:

while read -r VarName VarVal junk;
  do eval "$VarName=\"$VarVal\"";
done < /tmp/exampleData;
GX1="GY1"
GX1="0.5915206"
GY1="0.0139938"
GZ1="-0.0876734"
GX2="-0.5223003"
GY2="0.0078178"
GZ2="-0.0489795"
GX3="-0.0692203"
GY3="-0.0218115"
GZ3="0.1366530"

for i in $(cut -f1 -d ' ' /tmp/exampleData );
  do eval "echo $i → $"$i ;
done
cut -f1 -d ' ' /tmp/exampleData 
echo GX1 → $GX1
GX1 → 0.5915206
echo GY1 → $GY1
GY1 → 0.0139938
echo GZ1 → $GZ1
GZ1 → -0.0876734
echo GX2 → $GX2
...
    
por 14.12.2016 / 20:45