我有一个配置文件,其变量和值由空格分隔。我想获取某些匹配的值(在第二列)并内联编辑文件,将此匹配除以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