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
在保持相同陣型的同時做到這一點嗎?
您可能只想進行字元串比較,而不是在第二列上進行正則表達式匹配。要使用您給出的範例執行此操作,您必須在比較中包含單引號,這會將整個事情變成一個 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{}
塊。- 在主程序中,我只是檢查是否
$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