Awk

使用 awk 查找和替換不同的列

  • July 2, 2014

我嘗試在文件中進行更改:

使用 查找某個值並將其替換為不同列中的另一個值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在保持相同陣型的同時做到這一點嗎?

您可能只想進行字元串比較,而不是在第二列上進行正則表達式匹配。要使用您給出的範例執行此操作,您必須在比較中包含單引號,這會將整個事情變成一個 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

這裡的第一個問題是引用了您的值。我建議您只需使用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{}塊。
  • 在主程序中,我只是檢查是否$2c數組中定義,如果是,我用$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

引用自:https://unix.stackexchange.com/questions/140185