2010-09-13 16 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