我有一個配置文件,其變量和值由空格分隔。我想獲取某些匹配的值(在第二列)並內聯編輯文件,將此匹配除以2.我還想保留間距並在值上使用吊頂函數。如何保留空白並在One-Liner Awk內聯編輯中使用吊頂功能?
例如,文件: 總結一下,用一個實際的例子文件,如果我的文件是:
OTHER TEXT 1
OTHER TEXT 2
restartfreq 325
dcdfreq 325
xstFreq 325
outputEnergies 325
outputPressure 325
OTHER TEXT 3
將成爲:
OTHER TEXT 1
OTHER TEXT 2
restartfreq 163
dcdfreq 163
xstFreq 163
outputEnergies 163
outputPressure 163
OTHER TEXT 3
我寧願做這一切一個使用Linux命令的Bash腳本。我曾考慮切換到一個小型的C++程序,但現在我堅持使用基於工具的腳本解決方案。
朝着這個工作,我上週發佈的這項調查:
How Can I Mix Math with Regex's in Awk or Sed?
我來到最終以長篇大論的解決方案,但ghostdog74提出這更雄辯的解決方案:
awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file
這做什麼我想......差不多。
正如我所說的,我還需要實現一個天花板功能,並且最好保留空白區域 - 我希望能夠將多個匹配值分開,而不僅僅是一個。
我可以在單行或小嵌套的awk腳本中執行此操作嗎?有小費嗎??
解決方案:
我已經採取Ghostdog的回答是:
awk '$1~/[fF]req|output/{ n=$2/2; sub(/ [0-9][0-9]*$/,n)}1' file
而且修改了它稍微允許上線的最後意見,並按照執行天花板我請求。我將要求一個關於如何在awk一行中使用短函數的單獨函數。
awk '$1~/restartfreq|dcdfreq|xstFreq|outputEnergies|outputPressure/{ a=$2/2; n= (a== int(a)) ? a : int(a)+1; sub(/ [0-9][0-9]*.*$/,n)}1' file > temp && mv -f temp file
好工作Ghostdog!
好吧,幾乎做我想要的一切,但我只注意到,如果有評論(用「;」表示這種格式)命令不起作用。例如「restartfreq 2500」有效,但「restartfreq 2500;#2500steps =每1.25 ps」不起作用。另外,關於如何對數字進行天花板功能的任何想法(你可以使用if語句,我想?)? – 2010-09-13 16:52:36
awk'$ 1〜/ restartfreq | dcdfreq | xstFreq | outputEnergies | outputPressure/{n =($ 2/2 temp && mv -f temp && mv -f temp my_file.conf –
2010-09-13 17:27:39
...計算出來,看到上面(添加有條件執行天花板操作和「。*」給你的正則表達式忽略數字後的任何評論。謝謝ghostdog !! :) – 2010-09-13 17:28:35