2010-09-13 17 views
2

我有一個配置文件,其變量和值由空格分隔。我想獲取某些匹配的值(在第二列)並內聯編輯文件,將此匹配除以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!

回答

2
$ awk '$1~/[fF]req|output/{ n=$2/2; sub(/ [0-9][0-9]*$/,n)}1' file 
OTHER TEXT 1 
OTHER TEXT 2 
restartfreq  162.5 
dcdfreq   162.5 
xstFreq   162.5 
outputEnergies 162.5 
outputPressure 162.5 
OTHER TEXT 3 
+0

好吧,幾乎做我想要的一切,但我只注意到,如果有評論(用「;」表示這種格式)命令不起作用。例如「restartfreq 2500」有效,但「restartfreq 2500;#2500steps =每1.25 ps」不起作用。另外,關於如何對數字進行天花板功能的任何想法(你可以使用if語句,我想?)? – 2010-09-13 16:52:36

+0

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

+0

...計算出來,看到上面(添加有條件執行天花板操作和「。*」給你的正則表達式忽略數字後的任何評論。謝謝ghostdog !! :) – 2010-09-13 17:28:35