A primeira questão aqui é que seus valores são citados. Sugiro que você simplesmente remova as aspas com o comando sed
e, se realmente precisar delas, coloque-as de volta depois de processar o arquivo com awk
. Algo como
sed "s/'//g" UiO-66Zr-EH.mof | awk '{$2=q $2 q}' q="'"
O truque acima define a variável q
to '
então q $2 q
é equivalente a '$2'
. Apenas uma maneira fácil de fazer com que awk
seja legal com aspas simples.
Com base no seu script, você parece querer realizar as seguintes substituições:
$2 is $3 should be
---------------------
Zr1 2.008.d0
O25 -1.179d0
O1 -0.582d0
C25 -0.121d0
C13 -0.002d0
C1 0.625d0
O29 -0.741d0
H1 0.127d0
H25 0.495d0
Se assim for, eu faria algo como
$ sed "s/'//g" UiO-66Zr-EH.mof |
awk 'BEGIN{
c["Zr1"] = "2.008.d0";
c["O25"] = "-1.179d0";
c["O1"] = "-0.582d0";
c["C25"] = "-0.121d0";
c["C13"] = "-0.002d0";
c["C1"] = "0.625d0";
c["O29"] = "-0.741d0";
c["H1"] = "0.127d0";
c["H25"] = "0.495d0";
}
{if( $2 in c){$3=c[$2]; $2=q$2q}}1;' q="'"
Explicação
- O
sed
inicial apenas remove todas as aspas simples do arquivo de entrada.
- O resultado do sed é passado como entrada para
awk
- O bloco
BEGIN{}
é executado antes de o arquivo ser lido e um conjunto associativo contendo seus mapeamentos está configurado.
- No programa principal, simplesmente verifico se
$2
está definido na matriz c
e, se estiver, substituirei $3
pelo valor correspondente da matriz.
- O
$2=q$2q
apenas coloca as aspas simples em torno de $2
.
- Finalmente, o
1;
imprime a linha.
A saída quando executada no seu exemplo é:
unit ntype qqatom
1 'Zr1' 2.008.d0
vibration
0
improper
0
unit ntype qqatom
2 'H1' 0.127d0
vibration
0
improper
0
unit ntype qqatom
3 'C25' -0.121d0
vibration
0
improper
0
unit ntype qqatom
4 'O1' -0.582d0