使用 awk 查找并替换不同的列

使用 awk 查找并替换不同的列

我尝试更改文件:

使用 查找某个值并将其替换为不同列中的另一个值awk

输入( UiO-66Zr-EH.mof):

unit ntype qqatom
  1  'Zr1'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  2  'H1'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  3  'C25'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  4  'O1'  0.0d0

输出( output):

unit ntype qqatom
  1  'Zr1'  2.222d0
vibration
0
improper
0
unit ntype qqatom
  2  'H1'  3.333d0
vibration
0
improper
0
unit ntype qqatom
  3  'C25'  7.456d0
vibration
0
improper
0
unit ntype qqatom
  4  'O1'  9.99d0

我试过这个命令:

awk < UiO-66Zr-EH.mof '$2 ~ /Zr1/ {$3 ="2.222.d0"}1''$2 ~ /O1/ {$3 ="9.99d0"}1''$2 ~ /C25/ {$3 ="7.45d0"}1''$2 ~ /H1/ {$3 ="3.333d0"}1' > output

但它的功能不太好。

我可以用 来做到这一点awk,同时保持相同的阵型吗?

答案1

您可能只想进行字符串比较,而不是对第二列进行正则表达式匹配。要使用您给出的示例执行此操作,您必须在比较中包含单引号,这将整个事情变成了 shell 引用噩梦。这样做会得到以下结果:

awk "\$2==\"'Zr1'\" { \$3=\"2.222.d0\" }
     \$2==\"'O1'\" { \$3=\"9.99d0\" }
     \$2==\"'C25'\" { \$3 =\"7.45d0\" }
     \$2==\"'H1'\" { \$3 =\"3.333d0\" }
     { print }" <UiO-66Zr-EH.mof

答案2

这里的第一个问题是你的价值观被引用。我建议您只需使用命令删除引号sed,然后,如果您确实需要它们,请在使用 处理文件后将它们放回去awk。就像是

sed "s/'//g" UiO-66Zr-EH.mof | awk '{$2=q $2 q}' q="'" 

上面的技巧将变量设置q'soq $2 q相当于'$2'。这是一个awk使用单引号的简单方法。

根据您的脚本,您似乎想要执行以下替换:

$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

如果是这样,我会做类似的事情

$ 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="'" 

解释

  • 最初sed只是从输入文件中删除所有单引号。
  • sed 的结果作为输入传递给awk
  • BEGIN{}块在读取文件之前执行,并且关联数组包含您的映射已设置。
  • 在主程序中,我只需检查数组$2中是否定义了c,如果是,则替换$3为数组中的相应值。
  • 只是$2=q$2q将单引号放回原处$2
  • 最后,1;打印该行。

在您的示例上运行时的输出是:

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

相关内容